2009-10-15 2 views
4

В моей базе данных у меня есть пользователи и UserGroups, которые имеют отношение «многие ко многим». Пользователь имеет набор UserGroup, объект домена UserGroup не видит пользователя.Как автоматически удалить ассоциации «многие-ко-многим» (каскад)

<class name="User" table="UserTable"> 
    <set name="UserGroup" cascade="save-update" access="field.pascalcase-underscore" table="User2UserGroup"> 
     <key column="User_Id" /> 
     <many-to-many class="UserGroup" column="UserGroup_Id" /> 
    </set> 
    ... 

То, что я пытаюсь достичь является NHibernate удалить корреляцию из таблицы перехода, когда я удалить группу пользователей пользователя или. Кроме того, пользователь и группа являются дочерними объектами, назовем его Домен. Домен делает cascade="all-delete-orphans", поэтому, когда домен удаляется, он каскад - удаляет все его Пользователи и UserGroups.

Обратно к пользователю < -> Отношение UserGroup: Если я правильно понимаю, я не могу использовать каскад любой формы, который включает удаление, поскольку я просто хочу удалить связь между двумя объектами, а не сам связанный объект. (Группа не исчезает, даже если она является сиротой. И пользователь без группы является действительной вещью в моем мире - он просто не имеет права вообще что-либо делать.)

Нужно ли мне смотреть события/перехватчики? Или я могу делать то, что хочу достичь, контролируя отображение?

ответ

2

Если вы используете базу данных, которая поддерживает его можно не устанавливать каскад на самой базе данных в виде ограничения внешнего ключа?

+0

Это может сработать, но я подозреваю, что это может создать массу проблем в кеше NHibernate. – froh42

+1

AFAIK нет проблемы с использованием каскадного удаления в базе данных с NHibernate. Для обсуждения с помощью решения этого с прослушивателями событий (в NHibernate 2.1) проверить этот документ: http://elegantcode.com/2009/07/19/nhibernate-2-1-and-collection-event-listeners/ –

+0

Майкл, спасибо за все вход и ссылку. Поскольку я уже просмотрел список слушателей событий (на самом деле, я уже продолжал регистрировать листингщик событий do-nothing в своем приложении), это направление, в котором я продолжу. Даже если база данных может удалять вещи за кулисами (что может быть даже намного быстрее), я предпочитаю не делать этого, так как хочу сохранить все на одном уровне. Из корней pre-nhibernate-2 моего приложения у меня все еще есть нездоровое количество SQL вместо исполняемого HQL. – froh42

Смежные вопросы