Question

J'essaie d'implémenter la hiérarchie d'héritage de classes avec NHibernate et SQL Server. Je l’ai bien fait avec la stratégie table par hiérarchie (une table et plusieurs éléments de sous-classe dans le fichier de mappage).

Cependant, la stratégie table par sous-classe (N + 1 tables et N éléments de sous-classes jointes dans un fichier de mappage) est plus logique dans mon cas car je souhaite imposer certaines contraintes aux tables de sous-classes. Je me demande quel type d'association PK / FK je devrais mettre sur la table de la classe principale (Personnes) et la table de la sous-classe (ContactPersons). Selon la documentation de NHibernate, il devrait exister une association de clé primaire entre les tables. J'ai essayé de mettre la contrainte FK de la sous-classe PK dans la classe de maître PK mais cela ne fonctionne toujours pas. Je reçois l'exception suivante:

NHibernate.Exceptions.GenericADOException: impossible d'insérer: [Jobflow.Models.Entities.ContactPerson] [SQL: INSERT INTO ContactPersons (Email, Company, PersonID) VALEURS (?,?,?)] --- > System.Data.SqlClient.SqlException: impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'ContactPersons' lorsque IDENTITY_INSERT est défini sur OFF.

J'ai essayé de définir IDENTITY_INSERT sur ON, mais cela n'a pas semblé aider ...

Était-ce utile?

La solution

Vous devez déclarer la colonne dans Persons en tant qu'identité int, mais dans ContactPersons en tant qu'int uniquement - une seule table doit assurer le suivi de la valeur d'identité. Vos clés étrangères / clés primaires vont bien, c’est le seul problème à résoudre.

NHibernate insérera dans Personnes, obtiendra la nouvelle valeur d’identité à l’aide de SCOPE_IDENTITY (), puis utilisera cette valeur explicitement pour l’insertion dans ContactPersons.

Autres conseils

Je crée le schéma avec SchemaExport de NH. Il crée une clé étrangère sur la clé primaire des sous-classes:

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

Persons_FK est déclaré dans le fichier de mappage

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top