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...