Pregunta

Estoy intentando implementar la jerarquía de herencia de clases con NHibernate y el servidor SQL. Hice que funcionara bien con la estrategia de tabla por jerarquía (una tabla y varios elementos de subclase en el archivo de mapeo).

Sin embargo, la estrategia de tabla por subclase (tablas N + 1 y N elementos de subclase unidos en un archivo de mapeo) tiene más sentido en mi caso porque quiero poner algunas restricciones en las tablas de subclases. Estoy teniendo problemas con el tipo de asociación PK / FK que debo colocar en la tabla de clases magistrales (Personas) y en la tabla de subclases (Personas de contacto). De acuerdo con la documentación de NHibernate, debe haber una asociación de clave principal entre las tablas. Intenté poner la restricción FK de la subclase PK a la clase maestra PK pero todavía no funciona. Obtengo la siguiente excepción:

NHibernate.Exceptions.GenericADOException: no se pudo insertar: [Jobflow.Models.Entities.ContactPerson] [SQL: INSERT INTO ContactPersons (Email, Company, PersonID) VALUES (?,?,?)] --- > System.Data.SqlClient.SqlException: No se puede insertar un valor explícito para la columna de identidad en la tabla 'ContactPersons' cuando IDENTITY_INSERT está desactivado.

Intenté configurar IDENTITY_INSERT en ON, pero eso no pareció ayudar ...

¿Fue útil?

Solución

Debe declarar la columna en Personas como identidad int, pero en Personas de contacto como int. solo una tabla necesita realizar un seguimiento del valor de identidad. Sus claves externas / primarias están bien, este es el único problema que debe abordar.

NHibernate se insertará en Personas, obtendrá el nuevo valor de identidad utilizando SCOPE_IDENTITY () y luego usará ese valor explícitamente para la inserción en ContactPersons.

Otros consejos

Estoy creando el esquema con SchemaExport de NH. Crea una clave externa en la clave principal de las subclases:

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

Persons_FK se declara en el archivo de mapeo

<joined-subclass name="ContactPersons">
  <key column="Persons_FK"/>
  ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top