Estoy trabajando con una base de datos heredada que usa claves compuestas. Y estoy tratando de usar NHibernate para insertar un nuevo registro en la base de datos. NHibernate especifica que tengo que crear el ello de forma manual, pero cuando intento insertar con este id me sale el mensaje:Insertar un registro con una clave compuesta con NHibernate
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
no puedo tocar cualquiera de los ajustes db, ya que son administrados por la oficina central en EE.UU..
I encontraron que pueda hacer un inserto db a través de:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
y la columna de la tablename_id
se incrementa automáticamente.
Es posible escribir algún tipo de controlador que me permita crear un objeto ID
con el conjunto CountryId
y hacer que aumente automáticamente la propiedad Id
.
Saludos.
Código Ejemplo:
Tabla Definición:
CREATE TABLE [dbo].[tablename](
[tablename_country_id] [int] NOT NULL,
[tablename_id] [int] IDENTITY(1,1) NOT NULL,
-- more fields here
CONSTRAINT [pk_tablename] PRIMARY KEY
(
[tablename_country_id] ASC,
[tablename_id] ASC
)
)
archivos de clase:
public class ModelObject
{
public ID { get; set; }
// more properties here
}
public class ID : INHibernateProxy
{
public int Id { get; set; }
public int CountryId { get; set; }
public ILazyInitializer HibernateLazyInitializer { get { throw new ApplicationException(); } }
}
Archivo de asignación:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model" assembly="API">
<class name="ModelObject" table="dbname.dbo.tablename" lazy="false">
<composite-id name="Id" class="ID">
<key-property name="Id" column="tablename_id" type="int" />
<key-property name="CountryId" column="tablename_country_id" type="int" />
</composite-id>
<!-- more properties here -->
</class>
</hibernate-mapping>
¿Cómo afectaría esto al almacenamiento en caché de objetos? En particular, la 'sesión. Obtiene (id);' con la posibilidad de duplicados en la columna 'tablename_id'. –
zonkflut
esta opción arroja una FKUnmatchingColumnsException 'debe tener el mismo número de columnas que la clave primaria referenciada' – zonkflut