nhibernate не каскадно удаляет детей - PullRequest
6 голосов
/ 05 марта 2010

Сценарий таков:

У меня есть 3 объекта (я упростил имена) с именем Родитель, родительский ребенок и дочерний ребенок
дочерний элемент parent является набором parent, а дочерний элемент child является набором child.

отображение выглядит следующим образом (соответствующие части)

родитель

<set name="parentset"
     table="pc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column=FK_ID_PC" on-delete="cascade"/>
  <one-to-many class="parentchild,parentchild-ns"/>
</set>

родительский ребенок

<set name="childset"
     table="cc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column="FK_ID_CC" on-delete="cascade"/>
  <one-to-many class="childschild,childschild-ns"/>
</set>

Чего я хочу добиться, так это того, чтобы при удалении родителя происходил каскадный процесс удаления до самого ребенка. Но сейчас происходит следующее.

(это исключительно для целей картографического тестирования) получение родительского объекта (работает нормально)

IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();

теперь удаляемая часть

session.Delete(doc);
transaction.Commit();

После устранения ошибки «невозможно вставить нулевое значение» с каскадом и инверсией, я надеюсь, теперь это удалит все с этим кодом, но удаляется только родительский элемент.

Я пропустил что-то в моем отображении, что, вероятно, будет пропущено? Любой намек в правильном направлении приветствуется!


Диего, спасибо за точный ответ. (и объяснение)

Я пошел с удалением on-delete="cascade", потому что мне нравится как можно больше контроля в коде, а не в базе данных.

Код, размещенный ниже, является (рабочим) результатом.

родитель

<set name="parentset"     
     table="pc-table"     
     cascade="all-delete-orphan"     
     inverse="true"
     batch-size="5">     
  <key column=FK_ID_PC"/>     
  <one-to-many class="parentchild,parentchild-ns"/>     
</set>

родительский ребенок

<set name="childset"            
     table="cc-table"     
     cascade="all-delete-orphan" 
     batch-size="5"  
     inverse="true">            
  <key column="FK_ID_CC">            
  <one-to-many class="childschild,childschild-ns"/>            
</set>

Надеюсь, это поможет людям с такой же проблемой!

1 Ответ

6 голосов
/ 05 марта 2010

Установив on-delete="cascade" на клавиши, вы позволяете БД обрабатывать каскад.

Вы генерируете свою схему с помощью NHibernate?

Я только что воспроизвел ваш пример, и он работал нормально с этим атрибутом и без него. При удалении NHibernate делает каскадирование.

Кстати, использование lazy="false" fetch="subselect" не то, что вы должны делать по умолчанию. Если вы удалите эти атрибуты, оставите on-delete="cascade" и измените cascade на save-update, у вас будет только два запроса для извлечения и удаления Parent.

...