Ich arbeite mit einer Legacy-Datenbank, die zusammengesetzte Schlüssel verwendet. Und ich versuche, NHibernate zu verwenden, um einen neuen Datensatz in die Datenbank einzufügen. NHibernate gibt an, dass ich die Id manuell erstellen, aber wenn ich versuche, mit dieser ID einfügen erhalte ich die Meldung:Einfügen eines Datensatzes mit einem zusammengesetzten Schlüssel mit NHibernate
System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
ich keine der db-Einstellungen berühren kann, wie sie durch Hauptsitz in den USA verwaltet werden.
fand ich, dass ich über einen db Einsatz kann:
insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
und die tablename_id
Spalte wird automatisch erhöht.
Ist es möglich, eine Art von Handler zu schreiben, der es mir erlaubt, ein ID
Objekt mit dem CountryId
-Set zu erstellen und es die Id
Eigenschaft automatisch zu inkrementieren.
Prost.
Beispielcode:
Tabelle Definition:
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
)
)
Klassendateien:
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-Datei:
<?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>
Wie wirkt sich dies auf das Caching von Objekten aus? Insbesondere die 'session.Get (id);' mit der Möglichkeit von Duplikaten in der Spalte 'tablename_id'. –
zonkflut
Diese Option löst eine FKUnmatchingColumnsException aus "muss die gleiche Anzahl von Spalten wie der referenzierte Primärschlüssel haben" – zonkflut