nhibernate не располагается каскадом, удаляют дочерние элементы

Сценарий следующим образом,

У меня есть 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>

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

6
задан casperOne 13 June 2012 в 13:59
поделиться

1 ответ

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

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

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

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

6
ответ дан 17 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: