nhibernate не каскадно удаляет детей

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

У меня есть 3 объекта (я упростил имена) с именем Parent, parent's child и child's child
дочерний элемент 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам