2009-03-02 4 views
2

У меня есть следующие объектной модели:NHibernate отображение Проблема

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

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

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

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

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

ответ

1

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

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

много-в-любом магазине имя типа и 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> 

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

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

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