NHibernate juntou-subclasse
-
03-07-2019 - |
Pergunta
Eu estou tentando implementar classe hieararchy herança com servidor NHibernate e SQL. Eu fiz isso funcionar bem com a estratégia tabela por hierarquia (uma mesa e vários elementos da subclasse no arquivo de mapeamento).
No entanto, a estratégia tabela por subclasse (n + 1 tabelas e N elementos juntaram-subclasse em um arquivo de mapeamento) faz mais sentido no meu caso porque eu quero colocar algumas restrições nas tabelas subclasses. Eu estou lutando com o que tipo de associação PK / FK devo colocar na mesa de masterclass (Pessoas) e tabela de subclasse (ContactPersons). De acordo com a documentação do NHibernate, deve haver uma associação de chave primária entre as mesas. Eu tentei colocar a restrição FK do PK subclasse ao PK master class mas ainda não funciona. Eu recebo a seguinte exceção:
NHibernate.Exceptions.GenericADOException: não foi possível inserir: [Jobflow.Models.Entities.ContactPerson] [SQL: INSERT INTO ContactPersons (e-mail, empresa, PersonID) VALUES (?,?,?)] ---> Sistema. Data.SqlClient.SqlException:. não é possível inserir valor explícito para coluna de identidade na tabela 'ContactPersons' quando IDENTITY_INSERT está definido como OFF
Eu fiz tentar definir a IDENTITY_INSERT a ON mas isso não parece ajudar ...
Solução
Você precisa declarar a coluna de Pessoas como identidade int, mas em ContactPersons como apenas int - apenas um necessidades tabela para acompanhar o valor de identidade. Suas chaves estrangeiras / chaves primárias estão bem, este é o único problema que você precisa resolver.
NHibernate irá inserir Pessoas, obter o novo valor de identidade usando SCOPE_IDENTITY () e, em seguida, usar esse valor explicitamente para a inserção em ContactPersons.
Outras dicas
Estou criando o esquema com NH SchemaExport. Ele cria uma chave estrangeira na chave primária subclasses:
alter table ContactPersons
add constraint FK81E543E94B3FF9C3
foreign key (Persons_FK)
references Persons
Persons_FK é declarado no arquivo de mapeamento
<joined-subclass name="ContactPersons">
<key column="Persons_FK"/>
...