2012-02-20 54 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。