Je travaille avec une base de données existante qui utilise des clés composites. Et j'essaie d'utiliser NHibernate pour insérer un nouvel enregistrement dans la base de données. NHibernate précise que je dois créer l'ID manuellement, mais lorsque je tente d'insérer cette id je reçois le message:Insertion d'un enregistrement avec une clé composite à l'aide de NHibernate
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
Je ne peux pas toucher les paramètres db car ils sont administrés par le siège social aux Etats-Unis.
Je trouve que je peux faire un insert db via:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
et la colonne tablename_id
est automatiquement incrémentée.
Est-il possible d'écrire une sorte de gestionnaire qui me permet de créer un objet ID
avec l'ensemble CountryId
et d'avoir auto-incrémenter la propriété Id
.
Cheers.
Exemple de code:
Tableau Définition:
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
)
)
Class 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(); } }
}
fichier de mappage:
<?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>
Comment cela affectera la mise en cache des objets? En particulier le 'session.Get (id);' avec la possibilité de doublons dans la colonne 'tablename_id'. –
zonkflut
cette option lance une FKUnmatchingColumnsException « doit avoir le même nombre de colonnes que la clé primaire référencée » – zonkflut