NHibernate присоединился подкласс - PullRequest
3 голосов
/ 29 апреля 2009

Я пытаюсь реализовать иерархию наследования классов с помощью NHibernate и SQL-сервера. Я сделал так, чтобы он отлично работал с таблицей в соответствии со стратегией иерархии (одна таблица и несколько элементов подкласса в файле отображения).

Однако стратегия «таблица на подкласс» (N + 1 таблиц и N элементов объединенного подкласса в одном файле отображения) имеет больше смысла в моем случае, потому что я хочу наложить некоторые ограничения на таблицы подклассов. Я борюсь с тем, какую связь PK / FK я должен поместить в таблицу мастер-класса (Persons) и таблицу подклассов (ContactPersons). Согласно документации NHibernate, между таблицами должна быть связь первичного ключа. Я попытался поместить ограничение FK из подкласса PK в мастер-класс PK, но оно все еще не работает. Я получаю следующее исключение:

NHibernate.Exceptions.GenericADOException: не удалось вставить: [Jobflow.Models.Entities.ContactPerson] [SQL: INSERT INTO ContactPersons (Email, Company, PersonID) ЗНАЧЕНИЯ (?,?,?)] ---> Система. Data.SqlClient.SqlException: невозможно вставить явное значение для столбца идентификаторов в таблице «ContactPersons», если для параметра IDENTITY_INSERT установлено значение OFF.

Я пытался установить IDENTITY_INSERT в положение ON, но, похоже, это не помогло ...

Ответы [ 2 ]

4 голосов
/ 29 апреля 2009

Вам необходимо объявить столбец в Persons как int identity, а в ContactPersons - просто int - только одна таблица должна отслеживать значение идентификатора. Ваши внешние ключи / первичные ключи в порядке, это единственная проблема, которую вам нужно решить.

NHibernate вставит в Persons, получит новое значение идентификатора, используя SCOPE_IDENTITY (), а затем явно использует это значение для вставки в ContactPersons.

0 голосов
/ 29 апреля 2009

Я создаю схему с помощью SchemaExport от NH. Создает внешний ключ на первичном ключе подклассов:

alter table ContactPersons 
add constraint FK81E543E94B3FF9C3 
foreign key (Persons_FK) 
references Persons

Persons_FK объявлен в файле отображения

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
...