Поле идентификации в составном ключе с использованием FluentNHibernate

У меня есть таблица с составным ключом, одна часть которого является полем 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.

Как я могу работать с отображением, чтобы это работало?


person Bob Feeser    schedule 09.11.2011    source источник


Ответы (1)


некоторая альтернативная возможность состоит в том, чтобы сделать 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);
            })
    }
}
person Firo    schedule 10.11.2011