在Fluent NHibernate中将字段作为复合键和外键共享

时间:2013-02-21 11:01:06

标签: nhibernate fluent-nhibernate-mapping

请考虑以下映射代码:

public sealed class BankMapping : ClassMap<Bank>
{
    public BankMapping()
    {
        CompositeId()
            .KeyProperty(x => x.SerialNumber, "SerialBankRef")
            .KeyProperty(x => x.FinancialPeriodId, "FinancialPeriodRef");
        Map(x => x.Code);
        Map(x => x.Title);
        Map(x => x.Comment);
        Map(x => x.IsActive);            
        HasMany(x => x.BankBranchs).KeyColumns.Add(new[] { "SerialBankRef", "FinancialPeriodRef" });

    }
}

BankBranch映射代码为:

public sealed class BankBranchMapping : ClassMap<BankBranch>
{
    public BankBranchMapping()
    {
       CompositeId()
            .KeyProperty(x => x.FinancialPeriodId, "FinancialPeriodRef")
            .KeyProperty(x => x.SerialNumber, "SerialNumber");
        Map(x => x.Code);
        Map(x => x.Title);
        Map(x => x.Comment);
        Map(x => x.IsActive);
        Map(x => x.Address);
        Map(x => x.Fax);
        Map(x => x.Telephone);
        References(x => x.Bank).Columns(new[] { "SerialBankRef", "FinancialPeriodRef" });
    }
}

正如您所看到的,FinancialPeriodRef字段充当外键并且是BankBranch映射中的复合键的一部分,NHibernate正确构建数据库,并且在我尝试插入记录之前,一切似乎都没有问题BankBranch表。

错误System.IndexOutOfRangeException : Invalid index 10 for this SqlParameterCollection with Count=10.表示我已将两个字段(FinancialPeriodRef)映射为FK和PK两次,我不知道如何解决问题。

我需要FinancialPeriodRef中的BankBranch作为主键的一部分,而它绝对等于来自FinancialPeriodRef的{​​{1}}。

我需要此字段来建立唯一约束,并且复合键的好处也是必不可少的。

1 个答案:

答案 0 :(得分:3)

您需要使用KeyReference而不是KeyProperty进行映射,这也是FK。

public BankBranchMapping()
{
    CompositeId()
        .KeyReference(x => x.FinancialPeriodId, "FinancialPeriodRef")
        .KeyReference(x => x.SerialNumber, "SerialNumber");
    ...
}

我遇到了与你完全相同的问题,经过一个小时左右的时间发现了这篇帖子:https://stackoverflow.com/a/7997225/569662它指出了我的意思。