nHibernate Cascade="Удалить-Сирота" для нескольких ключей

Допустим, у меня есть следующие 3 таблицы:

Таблица A, Таблица B и Таблица C.

Таблица C имеет внешний ключ для таблицы A. Таблица C имеет внешний ключ для таблицы B.

Когда я удаляю строку из таблицы B I, я хочу, чтобы она удаляла сироту в таблице C, но только если она не содержит ссылок на таблицу A. Если она содержит ссылку на таблицу A I, она хочет удалить строку в таблице B и установите для внешнего ключа значение NULL в таблице C.

Это вообще возможно? каково это поведение по умолчанию?

1 ответ

Решение

Ваш сценарий является типичным "бизнес-требованием", а не "каскадным" требованием.

Как подробно обсуждено здесь: Когда / Почему использовать Каскадирование в SQL Server? (механизм одинаковый для каскадного удаления SQL / каскадного удаления NHibernate)

  • ...
  • Каскадное удаление может иметь смысл, когда семантика отношений может включать в себя эксклюзивное "является частью" описания. Например, запись OrderLine является частью родительского ордера, а OrderLines никогда не будут разделены между несколькими ордерами. Если ордер должен был исчезнуть, OrderLine также должен был бы, и строка без ордера была бы проблемой.
  • Каноническим примером для Каскадного удаления является SomeObject и SomeObjectItems, где не имеет никакого смысла, чтобы запись элементов когда-либо существовала без соответствующей основной записи.
  • ...

Опять же, хотя они касаются функции на сервере SQL, они также применимы и к функции каскада NHibernate.

Итак, в вашем случае, когда есть довольно сложная логика удаления, ответ должен быть:

  • переместить определение удаления за пределы уровня данных (отображение NHibernate)
  • поместите его внутри бизнес-уровня. Создайте правила вокруг этого, убедитесь в тестах, что ваша логика работает (независимо от механизма защиты, то есть NHibernate)
  • получайте прибыль в будущем от вашей / пользовательской логики удаления, как только пользователи будут корректировать свои требования. Вы не будете ограничены NHibernate...
Другие вопросы по тегам