2012-03-01 1 views
1

У меня есть простой класс, называемый «Родительский», и он содержит список дочерних объектов, которые называют его «Ребенок».Дети-сироты NHibernate при назначении нового «Ребенка» на «Родительский»

Существует простое отображение NHibernate между ними:

Mapping для ребенка

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

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); 

Проблема заключается в том, что при обновлении родителя, родитель получает новые дочерние объекты, но существует «сирота объектов», чей родительский идентификатор не существует в Чайлдсе таблице [те старые список объектов ребенка элементы]

В самом деле если я делаю, и обновление только после списка клиринга и после того, как назначить новый список ребенка существует не возражает не сирота ...

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

+0

Ну, это мое «деловое дело» ... Иногда мне приходится добавлять полностью новый дочерний список к существующему родительскому объекту. – Novalis

ответ

2

NH вставляет свою собственную реализацию IList, чтобы сделать свою работу по замене. Если вы замените его на другую реализацию, он будет потерян. В большинстве случаев неправильная практика заменяет реализацию, потому что код не знает, какая реализация действует.

лучше сделать

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