我正在编写应用程序并开始测试我的域模型实体。如果我创建一个实体公司的实例,就像这个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负责这个或者这是错误的方法吗?
答案 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