2010-06-20 100 views
1

我有父/子關係,和孩子有複合IDNHibernate的 - 與合併集合

家長

<id name="Id" type="Int32"> 
     <generator class="identity" /> 
    </id> 

<set name="Children" table="CTable" cascade="all-delete-orphan" inverse="true" lazy="false" > 
    <key column="ParentId"/> 
    <one-to-many class="ChildrenClass"/> 
</set> 

兒童

<composite-id unsaved-value="none"> 
    <key-property name="ParentId"/> 
    <key-property name="ChildId"/> 
</composite-id> 

我想要什麼的問題: 1)獲取父從DB關閉會話,將Parent從服務傳遞給客戶端 2)當Parent從客戶端返回時,將其及其所有子項保存在數據庫中,新會話

在步驟2中,我打電話給 var merged = Session.Merge(product);

我使用合併(),因爲它似乎使NHib處理兒童集合添加/刪除元素的唯一途徑。但NHibernate的重置所有ID-S在新增加的孩子,所以我有一個的ParentId == 0新的兒童和ChildId == 0.所以問題是 - 如何告訴NHibernate保留在Merge()中傳遞的實體的ID?請幫助。

回答

0

您的映射(和類模型)不正確。

孩子應該有一個對父母的引用,而不是一個Id。而映射應該是<key-many-to-one/>

+0

感謝您的回答!如果我在Parent中添加Child引用,如何仍然可以在父級中維護孩子的集合?當Parent.Children和Child.Parent引用都存在時,它會導致StackOverflowException(顯然)。我希望在父項中有孩子的集合,以便可以瀏覽它們。是否有可能? – Dmitry 2010-06-21 06:51:07

+0

「顯然」?你錯了。 NHibernate完全支持雙向關係。我建議你先閱讀文檔。 – 2010-06-21 11:43:13

+0

迭戈,我設法讓它工作,不知道它爲什麼沒有在第一次。謝謝! – Dmitry 2010-06-24 10:50:22