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

时间:2012-03-01 09:05:36

标签: hibernate nhibernate orm nhibernate-mapping

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

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

儿童的映射

 // 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

可能导致这种情况的原因是什么?以及如何解决它?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

做得更好

Parent.Childs.Clear();
foreach ( var item in NewChildObjectsList)
{
    Parent.Childs.Add(item);
}
Update(Parent); // Add new list then update