Удаление NHibernate один-ко-многим не каскадное - PullRequest
3 голосов
/ 21 января 2011

У меня есть класс «Фото» и класс «Комментарий».Фотография может иметь несколько комментариев.

Я настроил это как отношение «один ко многим» в моем файле отображения HBM и установил cascade = «all-delete-orphan» вместо «Комментарии».'bag внутри файла сопоставления 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 ]

4 голосов
/ 21 января 2011

Полагаю, проблема заключается в том, что в сопоставлении Комментария «многие к одному» установлено значение not-null = «true».Из-за этого NHibernate не может временно установить для этого свойства значение null до того, как он удалит объект Photo и, следовательно, когда дело доходит до удаления объекта Photo, SQL Server выдает исключение внешнего ключа.

Если я правильно помню дляпорядок действий при удалении:

  1. Установить значение внешнего ключа равным нулю во всех дочерних объектах
  2. Удалить родительский объект
  3. Удалить все дочерние ссылки

Попытайтесь удалить not-null = "true" из множества к одному и посмотрите, что произойдет.

2 голосов
/ 21 января 2011

Попробуйте с inverse="true" на наборе сумок вашего сопоставления.

1 голос
/ 17 мая 2011

У меня была похожая проблема в течение 1 дня ... и я был разочарован этим.

Наконец, решение сводилось к БД.Мне пришлось изменить ограничения ключа FK в «ВСТАВИТЬ ОБНОВЛЕНИЕ СПЕЦИФИКАЦИИ» «Удалить правило»: с «Без действия» на «Каскад»

дополнительно вы также можете установить «Обновить правило»: с «Без действия» на'Каскад'

0 голосов
/ 28 июня 2011

Вы можете указать опцию удаления-каскада в 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.

...