【问题标题】:nhibernate - problem with merging collectionsnhibernate - 合并集合的问题
【发布时间】:2010-06-20 23:59:55
【问题描述】:

我有父子关系,子有复合id

父母

    <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)从数据库中获取父级,关闭会话,将父级从服务传递给客户端 2)当父母从客户端回来时,将其及其所有子项保存在数据库中,在一个新会话中

在第 2 步中,我调用 var 合并 = Session.Merge(product);

我使用 Merge() 因为它似乎是使 NHib 处理子集合中添加/删除的元素的唯一方法。但是 nHibernate 重置了新添加的子项中的所有 id-s,所以我有 ParentId == 0 的新子项和ChildId == 0。所以问题是 - 如何告诉 NHibernate 保留在 Merge() 中传递的实体的 ID?.. 请帮助。

【问题讨论】:

    标签: nhibernate merge parent-child composite-id


    【解决方案1】:

    您的映射(和类模型)不正确。

    Child 应该有对 Parent 的引用,而不是 Id。并且映射应该是&lt;key-many-to-one/&gt;

    【讨论】:

    • 感谢您的回答!如果我在 Child 中添加对 Parent 的引用,我怎么还能在 parent 中维护孩子的集合?当 Parent.Children 和 Child.Parent 引用都存在时,它会导致 StackOverflowException(显然).. 我想在 parent 中收集孩子,以便我可以浏览它们.. 有可能吗?
    • “显然”?你错了。 NHibernate 完全支持双向关系。我建议你先阅读文档。
    • Diego,我设法让它工作了,不知道为什么第一次没有。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多