使用NHibernate插入带有复合键的记录

zon*_*lut 5 .net c# nhibernate composite-id

我正在使用使用复合键的旧数据库.我正在尝试使用NHibernate将新记录插入数据库.NHibernate指定我必须手动创建Id,但是当我尝试使用此id插入时,我收到消息:

System.Data.SqlClient.SqlException: Cannot insert explicit value for identity column in table 'tablename' when IDENTITY_INSERT is set to OFF.
Run Code Online (Sandbox Code Playgroud)

我无法触及任何数据库设置,因为它们由美国总部管理.

我发现我可以通过以下方式进行数据库插入:

insert into tablename (tablename_country_id, /*extra fields here*/) values (16, /*extra values here*/)
Run Code Online (Sandbox Code Playgroud)

并且tablename_id列自动递增.

是否可以编写某种处理程序,允许我ID使用该CountryId集创建一个对象并让它自动增加该Id属性.

干杯.


示例代码:

表定义:

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
    )
)
Run Code Online (Sandbox Code Playgroud)

类文件:

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(); } }
}
Run Code Online (Sandbox Code Playgroud)

映射文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

Che*_*rot 0

我认为您可以将身份列设置为复合键中的键之一。

我知道在 FluentnHibernate 中我有一个复合键的标识列名称