使用FluentNHibernate的复合键中的标识字段

时间:2011-11-09 16:59:15

标签: nhibernate identity composite-key

我有一个带有复合键的表,其中一部分是Identity字段。 Identity字段显然后来被添加,因为有超过1000个地方重复身份,因此依赖于复合键的第二部分来提供唯一性。这是表格声明:

CREATE TABLE [dbo].[tblSaveCommissions](
    [SaveTransID] [int] NOT NULL,
    [CommID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [AccountNumber] [varchar](40) NULL,
    ... (extra fields)
 CONSTRAINT [PK_tblSaveCommissions] PRIMARY KEY CLUSTERED 
(
    [SaveTransID] ASC,
    [CommID] ASC)
)

FluentNHibernate映射看起来像这样(缩写):

public class SaveCommissionMap : ClassMap<SaveCommissionEntity>
{
    public SaveCommissionMap()
    {
        Table("tblSaveCommissions");

        CompositeId()
            .KeyProperty(x => x.Id, "CommID")
            .KeyProperty(x => x.SaveTransactionId, "SaveTransId");

        Map(x => x.AccountNumber);

        References(x => x.SaveTransaction)
            .Column("SaveTransId").Not.Insert().Not.Update();
    }

现在,当我尝试插入记录时,出现以下错误:

System.Data.SqlClient.SqlException : Cannot insert explicit value for identity column in table 'tblSaveCommissions' when IDENTITY_INSERT is set to OFF.

如何使用映射来完成这项工作?

1 个答案:

答案 0 :(得分:0)

另一种可能性是使SaveCommission成为SaveTransaction的依赖组件。

class SaveTransaction
{
    public virtual IList<SaveCommission> Commissions { get; set; }
}

class SaveTransactionMap : ClassMap<SaveTransaction>
{
    public SaveTransactionMap()
    {
        HasMany(x => x.Commissions)
            .KeyColumn("SaveTransID")
            .AsBag()
            .OrderBy("CommID")
            .Component(c => 
            {
                c.ParentReference(x => x.SaveTransaction);
                c.Map(x => x.AccountNumber);
            })
    }
}