2009-12-30 6 views
3

Я использую Fluent и NHibernate. У меня есть два объекта: A & B, который имеет отношения «многие-ко-многим» между ними. Я использую однонаправленное отображение «многие-ко-многим», когда A HasMany B's. В B нет ссылки на A (однонаправленный).Каскад при удалении с использованием однонаправленного отображения Many-To-Many

Это создает третью таблицу (с именем ABMapping) в базе данных, которая имеет два столбца, связанные с первичными ключами A & B.

Если удалить объект А, записи из таблицы ABMapping, связанных с удаляются. Это круто.

Но теперь я не могу удалить объект B, поскольку он имеет ограничение FK. Как я могу настроить его так, чтобы при удалении B все записи, связанные с B в ABMapping, были удалены автоматически?

+0

Является ли однонаправленное ограничение важным? С его помощью на фундаментальном уровне вам придется искать все сопоставления для связанных с B для каждой записи в B, которая удаляется. – Clueless

+0

Да, отображение важно. И я хочу, чтобы избежать сценария, где при удалении B я должен явно удалить сопоставления на B. Это единственный способ пойти? Кроме того, что происходит для однонаправленного много-одного? Я думаю, это будет тот же самый сценарий. Если я удалю B, мне придется искать все объекты типа A, которые ссылаются на B, и удалять их перед удалением объекта B. – Zuber

ответ

1

Если B не ссылается на A, то он не знает о таблице сопоставления, поэтому он не может каскадировать удаление. Как я вижу, у вас есть два варианта:

  1. Каскад удаления в базе данных с использованием каскадных удалений на вашем FK или триггере.
  2. Соотношение отношений от B до A; вам не нужно подвергать его потребителям вашего класса, коллекция A может отображаться как частное поле с использованием стратегии доступа. Я всегда делаю это для коллекций (используя .Access.CamelCaseField (Prefix.Underscore)), чтобы я не показывал IList.
+0

Спасибо за помощь Джейми. Еще один вопрос, который у меня возникает, заключается в том, что если я использую двунаправленное сопоставление, а затем удаляю объект класса B, он должен удалять только сопоставление в таблице ABMapping. Однако, когда я пробовал настройки Cascade как .Delete или .DeleteOnCascade, он идет и удаляет объект A. У меня также был обратный набор на отображении в B. Я пробовал Cascade.None(), но в этом случае он не удалял отображение в ABMapping и дал мне ошибку нарушения ограничения. – Zuber

+0

@ Zuber - Мой ответ был неполным. Вы не должны использовать NH-каскад со многими-ко-многим. Вам нужно удалить объект B из коллекции A Bs (это удаляет ссылки), а затем удалить объект B. Я думаю, что если вы пройдете этот маршрут, вам не нужно будет отображать коллекцию A в B, но вы, вероятно, захотите, чтобы у вас была ссылка на объекты A, ссылающиеся на объект B. –

+0

@JamieIde Что вы подразумеваете под «каскадным удалением на вашем FK?» Вы имеете в виду, что есть способ сообщить Hibernate/JPA удалить все строки с ссылками FK для '@ Entity' перед удалением строки, использующей PK? (Потому что это было бы здорово). Если вы просто означаете 'Cascade.DELETE' на ссылку' B' на 'A', то это не интересно, потому что удаление 'B' также удалит строки' A'. – fommil

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