Вопрос

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

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

NHibernate.Исключения.GenericADOException:не удалось вставить:[Поток рабочих мест.Модели.Сущности.Контактное лицо][SQL:ВСТАВИТЬ В ЗНАЧЕНИЯ ContactPersons (Email, Company, PersonID) (?, ?, ?)] ---> System.Data.SqlClient.SQLException:Невозможно вставить явное значение для столбца identity в таблице 'ContactPersons', когда IDENTITY_INSERT имеет значение OFF.

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Persons_FK объявлен в файле сопоставления

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top