Поддержание нескольких один-ко-многим - PullRequest
0 голосов
/ 10 августа 2011

Вслед за NHibernate один-к-одному против 2 многие-к-одному

Существует ли простой способ поддерживать множественные отношения один-ко-многим, которые используются какпсевдо-один-к-одному.

enter image description here

Например,

Если у меня есть 2 сущности, Пользователь и Контакт, которые связаны FK для каждого (Пользователь.ContactId и Contact.UserID).

Каков наилучший способ сохранения того, что каждый ориентир указывает на другой.Было бы неправильно, чтобы система обновляла Пользователя другим контактом, но Контакт по-прежнему ссылается на Пользователя ...

1 Ответ

2 голосов
/ 10 августа 2011

Скорее всего, вам вообще не нужно поддерживать это, если вы удалите один из избыточных внешних ключей.Ваша схема базы данных не должна допускать подобных аномалий (userX ссылается на contactX, но contactX ссылается на userY).Концептуально у вас есть личные отношения между пользователем и контактом.Почему бы не иметь один-к-одному в отображениях NHibernate?Если это из-за отложенной загрузки, то не поддерживается для nullable один-к-одному в NHibernate?Существует решение этой проблемы, которое не включает избыточные внешние ключи в базе данных.

1) В отображении пользователя определите фиктивный список.Список может содержать только один или ноль элементов.Ноль обрабатывается как NULL (нет контакта).

<bag 
  name="_contact" 
  table="UserContacts" 
  lazy="true" 
  inverse="true" 
  cascade="all-delete-orphan" >

    <key column="UserId" />
    <one-to-many class="Contact" />
</bag>

В сопоставлении контактов определите один к одному:

<one-to-one name="_user" class="User" constrained="true" />

В базе данных вам нужно иметь PK Users.Id иодин (!) внешний ключ Contacts.UserID.

2) Другой вариант - просто иметь много-к-одному в сопоставлении пользователей и один FK Users.ContactId

<many-to-one 
   name="_contact" 
   column="ContactId" 
   cascade="all-delete-orphan" 
   unique="true" 
   lazy="proxy"/>

В любом случае запрашиваемое вами обслуживание не требуется и аномалииневозможны.

...