NHibernate应该为实体分配id还是应该由应用程序处理?

时间:2009-11-03 23:01:45

标签: nhibernate

我正在编写应用程序并开始测试我的域模型实体。如果我创建一个实体公司的实例,就像这个var公司=新公司(“我的公司”);我应该得到一个有效的实体,这意味着公司此时应该有一个Id正确吗?

所以问题是,目前我在hbm文件中定义的数据库中生成了Id生成,如下所示:

<id name="ObjectIdentity" column="CompanyId" type="System.Guid" unsaved-value="00000000-0000-0000-0000-000000000000">
  <generator class="guid.comb"/>
</id>

这在编写单元测试时会出现问题,因为我没有带有Id的实体,因为它在测试中没有触及db,也就是说我有一个无效的实体。

现在我应该在应用程序中分配Id而不是让nhibernate负责这个或者这是错误的方法吗?

5 个答案:

答案 0 :(得分:2)

在大多数情况下,你应该让NHibernate完成它的工作,即处理持久性。这很重要,因为它允许您轻松更改内容(我们从项目中的身份到hilo)。

我会问你为什么关心新创建的对象是否有id?从业务角度来看,持久性ID不相关,不应通过单元测试进行检查。如上所述,这是集成测试的领域。在应用程序的其余部分中,您应该小心如何使用对象持久性Id。请记住,不应将此视为对象业务ID /密钥。

答案 1 :(得分:0)

您需要在生成guid之前在实体上调用Session.Save。您可以调用Session.Save来生成实体,而无需将其实际保存到数据库。 This article在解释它方面做得相当不错

答案 2 :(得分:0)

NHibernate和Application都不应该处理标识符。将它留给数据库,因为这是您数据的唯一具体存储,它是您的应用程序中唯一知道已分配了哪些ID以及哪些ID可用的部分。

在数据库表上创建一个标识主键列:

CREATE TABLE dbo.sample (
id int primary key identity(1,1),
...
...
...)

映射你的实体:

<id name="ID" column="id">
<generator class="identity" />
</id>

第一次保存新实体时,数据库将自动生成主键。 IDENTITY(1,1)表示“给新行一个标识从'1'开始,然后每个后续行增加1”:所以1,2,3,4,5,6,7

答案 3 :(得分:-1)

如果您正在使用数据库生成的身份,则需要保存实体以获取ID, 如果你想创建自己的身份 - 这很好。 做什么适合你,记住你测试时选择的内容。

我通常决定哪个类更适合我 - 无论是DB生成还是我自己的。

答案 4 :(得分:-1)

Nhibernate应该为你生成Id。必须保护实体的Id属性。最好的方法是使用hilo