Поле удостоверения в составном ключе с использованием FluentNHibernate - PullRequest
1 голос
/ 09 ноября 2011

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

альтернативная возможность сделать 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);
            })
    }
}
...