2010-06-20 103 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