Сценарий следующим образом,
У меня есть 3 объекта (я упростил имена), названный Родителем, ребенком родителя и ребенком ребенка
ребенок родителя является набором в родителе, и ребенок ребенка является набором в ребенке.
отображение следующим образом (соответствующие части)
родитель
<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();
Решив 'не может вставить нулевое значение' ошибка с расположением каскадом и инверсией i надежд, это теперь удалило бы все с этим кодом, но только родитель удаляется.
Я пропускал что-то в своем отображении, которое, вероятно, будет пропущено? Любая подсказка в правильном направлении является больше, чем приветствие!
Diego, спасибо за к ответу точки. (и объяснение)
Я пошел с удалением 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>
Надежда это помогает людям с той же проблемой!
Установив для ключей on-delete = "cascade"
, вы разрешаете БД обрабатывать каскадирование.
Вы генерируете свою схему с помощью NHibernate?
Я только что воспроизвел ваш пример, и он отлично работал с этим атрибутом и без него. При его удалении NHibernate выполняет каскадирование.
Кстати, использование lazy = "false" fetch = "subslect"
не является тем, что вам следует делать по умолчанию. Если вы удалите эти атрибуты, оставьте on-delete = "cascade"
и измените cascade
на save-update
, у вас будет только два запроса для получения и удалить Родителя.