Я борюсь с небольшой проблемой и начинаю приходить к выводу, что это просто невозможно.
У меня есть таблица под названием Group. Как и в большинстве этих систем, в группе есть ParentGroup и коллекция Children. Таким образом, группа таблиц выглядит следующим образом:
Group
-ID (PK)
-Name
-ParentId (FK)
Я сделал свои сопоставления, используя FNH AutoMappings, но мне пришлось переопределить значения по умолчанию для этого:
p.References(x => x.Parent)
.Column("ParentId")
.Cascade.All();
p.HasMany(x => x.Children)
.KeyColumn("ParentId")
.ForeignKeyCascadeOnDelete()
.Cascade.AllDeleteOrphan()
.Inverse();
Теперь, общая идея состояла в том, чтобы иметь возможность удалить узел и все его дочерние элементы, которые также должны быть удалены NH. Таким образом, удаление единственного корневого узла должно в основном очистить всю таблицу.
Сначала я попытался с Cascade.AllDeleteOrphan
, но это работает только для удаления элементов из коллекции Children, а не для удаления родительского элемента.
Затем я попытался ForeignKeyCascadeOnDelete
, чтобы операция была передана в базу данных через on delete cascade
. Но как только я это сделаю, MSSql2008 не позволяет мне создать это ограничение, в результате чего:
Введение ограничения FOREIGN KEY
«FKBA21C18E87B9D9F7» на столе «Группа»
может вызвать циклы или несколько каскадов
пути. Укажите НА УДАЛИТЬ НЕТ ДЕЙСТВИЙ или
ОБНОВЛЕНИЕ НЕТ ДЕЙСТВИЙ, или изменить другие
Ограничения FOREIGN KEY.
Ну, и это все для меня. Я думаю, что я просто переберу детей и удалим их одного за другим, сделав таким образом N + 1. Если у кого-нибудь есть предложение о том, как сделать это более элегантно, я буду рад его услышать.