У меня есть сценарий в системе, который я пытался упростить, насколько это возможно. У нас есть таблица (позволяет называть их) артефакты, к артефактам можно получить доступ к любому числу ролей безопасности, а роли безопасности могут получить доступ к любому количеству артефактов. Таким образом, у нас есть 3 таблицы в базе данных - одна из которых описывает артефакты, описывающие роли и таблицу ассоциаций "многие-ко-многим", связывающую идентификатор артефакта с идентификатором роли.
Домен мудрый, у нас есть два класса: один для роли и один для артефакта. класс artefact имеет свойство IList, которое возвращает список ролей, которые могут получить к нему доступ. (Роли, однако, не предлагают свойства для получения артефактов, к которым можно получить доступ).
Таким образом, отображение nhibernate для артефакта содержит следующее:
<bag name="AccessRoles" table="ArtefactAccess" order-by="RoleID"
lazy="true" access="field.camelcase-underscore" optimistic-lock="false">
<key column="ArtefactID"/>
<many-to-many class="Role" column="RoleID"/>
</bag>
Все это прекрасно работает, и если я удалю артефакт, таблица ассоциаций будет очищена соответствующим образом, и все ссылки между удаленным артефактом и ролями будут удалены (роль не удалена, хотя, правильно - поскольку мы не хотим, чтобы сироты удален).
Проблема заключается в том, как удалить роль и автоматически очистить таблицу ассоциаций. Если в настоящее время я пытаюсь удалить роль, я получаю ссылочное ограничение, поскольку в таблице сопоставления для роли все еще есть записи. Единственный способ успешно удалить роль - это запрос для всех артефактов, которые ссылаются на эту роль, удалить роль из коллекции ролей artefact, обновить артефакты, а затем удалить роль - не очень эффективную или приятную, особенно когда в un- упрощенная система, роли могут быть связаны с любым количеством других таблиц/объектов.
Мне нужно уметь ссылаться на NHibernate, что я хочу, чтобы эта таблица ассоциаций была очищена всякий раз, когда я удаляю роль - возможно ли это, и если да - как это сделать?
Спасибо за любую помощь.