2012-02-20 91 views
0

我想在我的聚合根中添加一个新的实体。这工作正常,但不强制一代身份证。NHibernate强制生成集合插入

为了更清楚地看看下面的示例代码,其中所有实体都使用Id(e => e.Uid).GeneratedBy.GuidComb();进行映射。

​​

我想要的是,当我添加到newEntity将有UID重新加载SubEntites。 我不想在那里访问NHibernate ISession(因此Session.Save()或Refresh())是遥不可及的。

这是可能的,无需修改我的实体?

回答

0

我认为你有两个选择:

  1. 保存之前手动分配的ID。在这种情况下,除非添加VersionTimestamp列,否则NHibernate将无法检测到它是新实体。 See here

  2. 从您的方法中返回SubEntity本身(毕竟,在DDD中,为什么要传递GUID?)一旦将聚合根保存在该子实体中,任何持有该子实体的引用都将获得最新的id会话结束。据推测,在控制传递回前端代码之前,会话将被刷新,这是需要id的地方,但调用代码需要注意,在会话中途提取id是个坏主意。

+0

关于不通过Guid(我正在使用域事件来驱动事务性资源...)是正确的。我只需要保留对“新实体”的引用,直到会话被刷新。之后,Uid设置正确。 – sanosdole 2012-02-20 16:52:11

0

可以手动生成的ID(组ID生成器来分配),那么每次创建你应该设置其ID一个新的实体,您将有这个ID在你的应用程序中使用,而无需使用ISession.Later可以使用ISession将这个对象保存到数据库中。这种方法的唯一问题是NHibernate不会知道哪个对象被创建,哪个对象被更新(你不能使用SaveOrUpdate会话方法),你应该使用Save和Update方法也可以插入使用逻辑的拦截器来查看是否更新或插入了对象,然后再次使用SaveOrUpdate。