Sto lavorando con un database precedente che utilizza chiavi composite. E sto cercando di usare NHibernate per inserire un nuovo record nel database. NHibernate specifica che devo creare l'ID manualmente, ma quando provo ad inserire con questo ID ottengo il messaggio:Inserimento di un record con una chiave composta utilizzando NHibernate
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
non posso toccare una qualsiasi delle impostazioni db come sono amministrati da sede centrale negli Stati Uniti.
ho scoperto che posso fare un inserto db tramite:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
e la colonna tablename_id
viene automaticamente incrementato.
E 'possibile scrivere una sorta di gestore che mi consente di creare un oggetto ID
con il set CountryId
e farlo incrementare automaticamente la proprietà Id
.
Cheers.
Esempio di codice:
Tabella Definizione:
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
)
)
Classe Files:
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(); } }
}
Mapping File:
<?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>
In che modo ciò influisce sulla memorizzazione nella cache degli oggetti? In particolare la 'session.Get (id);' con la possibilità di duplicati nella colonna 'tablename_id'. –
zonkflut
questa opzione genera un FKUnmatchingColumnsException 'deve avere lo stesso numero di colonne della chiave primaria di riferimento' – zonkflut