NHibernate картографическая проблема - PullRequest
2 голосов
/ 02 марта 2009

У меня есть следующая объектная модель:

  • Абстрактный класс высшего уровня Element со многими детьми и потомками.
  • А класс Event.
  • Каждый Element содержит сумку Event с.
  • Каждый Event имеет указатель на родителя Element.

До сих пор - довольно стандартные отношения один-ко-многим.

Но я хочу использовать таблицу для конкретной стратегии класса. Таким образом, класс Element не сопоставлен с базой данных. Я попытался решить это следующим образом: каждый из конкретных потомков Element определяет свою собственную сумку Event s. Проблема в том, что каждый элемент <bag> содержит элемент <key>. Этот ключ указывает на свойство Parent Event. Это также делает столбец Parent в таблице Event s внешним ключом к таблице, содержащей Bag! Но один столбец не может быть внешним ключом для нескольких таблиц, и я получаю исключение при вставке.

Я также пытался сделать поле Parent в таблице Event полем типа «многие к любому». Это сработало. Но когда я хочу сделать отношение двунаправленным, то есть добавить мешки потомкам Element, я возвращаюсь к той же проблеме. Bag => внешний ключ => исключение при вставке.

Я уверен, что этот случай не так уникален, как кажется. Заранее благодарю за помощь.

1 Ответ

1 голос
/ 27 апреля 2009

Немного поздно, но у меня есть несколько советов.

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

"многие для любого" хранит имя типа, а NH знает, куда указывает внешний ключ. Но невозможно иметь ограничения для такого внешнего ключа.

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

<class name="A">
  <!-- ... -->
  <bag name="Events">
    <key column="A_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

<class name="B">
  <!-- ... -->
  <bag name="Events">
    <key column="B_FK"/>
    <one-to-many class="Event"/>
   </bag>
</class>

Вы можете иметь ограничения внешнего ключа для такого внешнего ключа, но нет ограничения не-null, потому что используется только один из этих внешних ключей.

Чтобы действительно иметь только один внешний ключ со всеми ограничениями, необходимо сопоставить элемент с отдельной таблицей.

...