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
у вас будет только два запроса для извлечения и удаления родителя.