NHibernate дети-сироты, когда назначить новый список "Child" для "Parent" - PullRequest
1 голос
/ 01 марта 2012

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

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

Mapping для Child

 // 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 для Parent

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

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

Фактически, если я это сделаю и обновлю толькопосле списка очистки и после назначения нового дочернего списка не существует дочерних объектов-сирот ...

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

Что может вызвать это?И как это исправить?Есть идеи?

1 Ответ

2 голосов
/ 01 марта 2012

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

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

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