2012-03-01 52 views
1

我有一个简单的类称为“父母”,它包含子对象列表称为“孩子”。NHibernate的孤儿孩子当分配新的“孩子”列表“父母”时

两者之间存在一个简单的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未在童车表[这些都是旧的子对象列表中的元素]

事实上存在如果我做,只更新结算清单后和分配新的子表不存在由于孤儿对象...

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

什么可能导致此?以及如何解决它?有任何想法吗?

+0

为什么你设置'Parent.Childs = NewChildObjectsList'?显然不够? – Firo 2012-03-01 09:41:17

+0

那么,这是我的“商业案例”...有时我必须添加全新的子列表到现有的父对象。 – Novalis 2012-03-01 09:49:47

回答

2

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

做得更好

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