Удаление NHibernate один-ко-многим не каскадное
У меня есть класс "Фото" и класс "Комментарий". Фотография может иметь несколько комментариев.
Я настроил это как отношение "один ко многим" в моем файле отображения HBM и установил cascade="all-delete-orphan" в сумке "Comments" в файле отображения Photo.hbm.xml.
Однако, если я пытаюсь удалить фотографию, с которой связаны 1 или более комментариев, я получаю сообщение "DELETE, конфликтующее с ограничением REFERENCE"FK_Comments_Photos""
Я попробовал несколько других каскадных опций для пакета комментариев в моем Photo.hbm.xml, но независимо от того, что я установил, я получаю один и тот же результат каждый раз. Я просто хочу иметь возможность удалить фотографию и автоматически удалять любые связанные комментарии.
Вот мое фотокартина (отредактировано для краткости):
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" .... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Photo" table="Photos">
<id name="PhotoId" unsaved-value="0">
<column name="PhotoId" />
<generator class="native" />
</id>
...
<bag name="Comments" table="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
<key column="PhotoId" />
<one-to-many class="Comment" />
</bag>
</class>
Вот мое отображение комментариев (отредактировано для краткости):
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... default-access="property" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Comment" table="Comments">
<id name="CommentId" unsaved-value="0">
<column name="CommentId"></column>
<generator class="native" />
</id>
...
<property name="Author" not-null="true" />
<property name="Body" not-null="true" />
<property name="Approved" not-null="true" />
<many-to-one name="Photo" not-null="true">
<column name="PhotoId" />
</many-to-one>
</class>
Кто-нибудь есть какие-либо предложения относительно того, почему каскад не происходит, когда я пытаюсь удалить фотографию с комментариями, связанными с ней?
ОБНОВЛЕНИЕ: единственный способ, которым я могу получить каскад, состоит в том, чтобы настроить "Правило удаления" в SQL Server для этого отношения на "Каскад", и это означает, что мне не нужно указывать какие-либо каскадные действия в моем NHibernate. Mapping. Тем не менее, это не идеально для меня - я хотел бы иметь возможность идеально настроить каскадное поведение в NHibernate Mapping, поэтому я все еще не понимаю, почему он не обращает внимания на мой NHibernate каскадная настройка?
4 ответа
Я полагаю, что проблема заключается в том, что в сопоставлении Комментария "многие к одному" установлено значение not-null="true". Из-за этого NHibernate не может временно установить для этого свойства значение null до того, как он удалит объект Photo, и, следовательно, когда дело доходит до удаления объекта Photo, SQL Server выдает исключение внешнего ключа.
Если я правильно помню, порядок действий при удалении есть:
- Установите значение внешнего ключа равным нулю во всех дочерних объектах
- Удалить родительский объект
- Удалить все дочерние ссылки
Попробуйте удалить not-null = "true" из "многие к одному" и посмотрите, что произойдет.
Попробуй с inverse="true"
на сумке коллекции вашего картирования.
У меня была похожая проблема в течение 1 дня... и я расстроился из-за этого.
Наконец решение сводилось к БД. Мне пришлось изменить ограничения ключа FK в "ВСТАВИТЬ ОБНОВЛЕНИЕ СПЕЦИФИКАЦИИ" "Удалить правило": с "Без действия" на "Каскад"
Кроме того, вы также можете установить "Обновить правило": от "Нет действий" до "Каскад"
Вы можете указать опцию delete-cascade в NH:
<bag name="Comments" cascade="all-delete-orphan" order-by="DateTimePosted desc" where="Approved=1">
<key column="PhotoId" on-delete="cascade"/>
<one-to-many class="Comment" />
</bag>
Вы, вероятно, должны сделать это наоборот. Тогда мне интересно, где указан ваш столбец FK_Comments_Photos.