将新的“子”列表分配给“父”时 NHibernate 孤儿

Posted

技术标签:

【中文标题】将新的“子”列表分配给“父”时 NHibernate 孤儿【英文标题】:NHibernate orphan childs when assign new "Child" list to "Parent" 【发布时间】:2012-03-01 09:05:35 【问题描述】:

我有一个简单的类,称之为“父”,它包含子对象列表,称之为“子”。

它们之间有一个简单的休眠映射:

儿童地图

 // Child mapping
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="X" namespace="X">
  <class name="Child" table="Childs">
    <id name="Id">
      <generator class="guid" />
    </id>
    <property name="Value"/>
  </class>
</hibernate-mapping>

父级映射

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="X" namespace="X">
  <class name="Parent" table="Parents">
    <id name="Id">
      <generator class="guid" />
    </id>
    <list name="Childs" lazy="false" cascade="all-delete-orphan">
      <key column="ParentId" />
      <index column="ChildIndex" />
      <one-to-many class="Child"/>
    </list>
  </class>
</hibernate-mapping>

所以在我的代码中

 IList<Child> NewChildObjectsList =....
 Parent.Childs.Clear();
 Parent.ChildObjectList = NewChildObjectsList;
 Update(Parent);

问题是,当更新父对象时,父对象获取新的子对象,但存在“孤儿对象”,其父 ID 不存在于 Childs 表中[那些是旧的子对象列表元素]

事实上,如果我在清除列表之后并在分配新子列表之后进行更新,则不存在孤立子对象...

 IList<Child> NewChildObjectsList =....
 Parent.Childs.Clear();
 Update(Parent); // ClearList then update
 Parent.Childs = NewChildObjectsList;
 Update(Parent); // Add new list then update

是什么原因造成的?以及如何解决?有什么想法吗?

【问题讨论】:

为什么要设置Parent.Childs = NewChildObjectsList?还不够清楚吗? 嗯,这就是我的“商业案例”...有时我必须将全新的子列表添加到现有的父对象中。 【参考方案1】:

NH 插入其自己的 IList 实现以使其更改跟踪工作。如果您将其替换为另一个实现,它将丢失。大多数情况下,替换实现是不好的做法,因为代码不知道哪个实现有效。

做得更好

Parent.Childs.Clear();
foreach ( var item in NewChildObjectsList)

    Parent.Childs.Add(item);

Update(Parent); // Add new list then update

【讨论】:

以上是关于将新的“子”列表分配给“父”时 NHibernate 孤儿的主要内容,如果未能解决你的问题,请参考以下文章

5进程创建FORK

在选择选项更改时将子组件中的道具传递给父组件

为啥不能将父指针分配给子指针?

winform 父窗体如何获取子窗体控件的值

如何使用 AutoMapper 将父引用分配给子属性

在 Flutter 中按下按钮时将新的小部件作为列表插入