2012-03-01 111 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