Как заставить NHibernate удалить дочерние ссылки при удалении родителя? - PullRequest
5 голосов
/ 15 января 2009

У меня есть объект NewsFeed, сопоставленный так:

<class name="NewsFeed">
    <id name="NewsFeedId">
        <generator class="guid"/>
    </id>

    <property name="FeedName" not-null="true" />
    <property name="FeedURL" not-null="true" />
    <property name="FeedIsPublished" not-null="true" />
</class>

И пользователи, которые могут иметь набор выбранных каналов, в которые они могут быть заинтересованы, отображаются следующим образом:

<class name="SystemUser">
    <id name="SystemUserId">
        <generator class="guid"/>
    </id>


    <set name="SelectedNewsFeeds" table="SystemUserSelectedNewsFeeds" cascade="all">
        <key column="SystemUserId" />
        <many-to-many column="NewsFeedId" class="NewsFeeds.NewsFeed, Domain"/>
    </set>

</class>

Я хочу, чтобы при удалении родительского NewsFeed все ссылки SelectedNewsFeed также удалялись без необходимости загружать каждого пользователя SystemUser и вручную удалять NewsFeed.

Каков наилучший способ достичь этого?

ОБНОВЛЕНИЕ : Использование cascade = "all-delete-orphan" вместо "all" все еще приводит к исключению при удалении NewsFeed:

Оператор DELETE конфликтует с ограничением REFERENCE "FKC8B9DF81601F04F4". Конфликт произошел в базе данных «Система», таблица «dbo.SystemUserSelectedNewsFeeds», столбец «NewsFeedId».

Ответы [ 3 ]

2 голосов
/ 15 января 2009

JMCD

Ваш второй подход:

Другая альтернатива - сломать отношения многие ко многим с объединением класс в середине, который nHiberate сможет определить родительско-детские отношения и каскад должен работать.

- это то, что люди nHibernate рекомендуют в своей документации.

Не используйте экзотические сопоставления ассоциаций.

Хорошие примеры использования для многих многим ассоциации редки. Большинство из раз вам нужна дополнительная информация хранится в «таблице ссылок». В этом случае, гораздо лучше использовать два связи один ко многим Промежуточный класс ссылок. На самом деле, мы думаю, что большинство ассоциаций один-ко-многим и многие-к-одному, вы следует соблюдать осторожность при использовании любых других стиль ассоциации и спросите себя, если это действительно необходимо.

Использование двух связей «один ко многим» добавляет гибкость для простого добавления других атрибутов к «подписке», таких как настройки уведомлений для этой конкретной подписки.

1 голос
/ 15 января 2009

Поскольку отношение внутри набора «многие ко многим», nHibernate не может определить, какой конец отношения является дочерним, а какой родительским, и для меня самый быстрый способ достичь того, чего я хотел, это просто напишите некоторый SQL, который я отправил через мой репозиторий, который удалил соответствующие новостные ленты из коллекции, а затем удалил родительский новостной канал. В следующий раз, когда коллекция была увлажнена, изменения были отражены.

Другой альтернативой является разрыв отношения «многие ко многим» с классом соединения в середине, который nHiberate сможет определить отношения родитель-потомок, и каскад должен работать.

0 голосов
/ 15 января 2009

изменение

cascade="all"

до

cascade="all-delete-orphan"

Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...