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

在Fluent NHibernate中作为复合键和外键共享字段,nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate Mapping,请考虑以下映射代码: public sealed class BankMapping : ClassMap<Bank> { public BankMapping() { CompositeId() .KeyProperty(x => x.SerialNumber, "SerialBankRef") .KeyProperty(x => x.FinancialPeriodId, "Financia

请考虑以下映射代码:

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" });

    }
}
如您所见,
FinancialPeriodRef
字段在
BankBranch
映射中充当外键和复合键的一部分,NHibernate正确地构建了数据库,在我尝试在
BankBranch
表中插入一条记录之前,一切似乎都很好

错误
System.IndexOutOfRangeException:此SqlParameterCollection的索引10无效,计数为10。
表示我已将字段(
FinancialPeriodRef
)映射为FK和PK出现的两倍,我不知道如何解决此问题

我需要
BankBranch
中的
FinancialPeriodRef
作为主键的一部分,而它绝对等于
Bank
中的
FinancialPeriodRef


我需要此字段来建立唯一约束,而且复合键的好处也很重要。

您需要使用KeyReference而不是KeyProperty来描述复合外键

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

我和你有着完全相同的问题,大约一个小时后,我看到了这篇文章:它把我指对了

不确定到底是什么导致了问题,但是
BankBranchMapping
类映射可能不是您想要的。看看
KeyReference
方法是如何在本例中使用的。使用
KeyReference
可以从映射中删除
引用(…
。此外,确保相关类(例如
Bank
等)的Id生成设置正确。我使用了[KeyReference]代替了引用,但问题仍然没有解决。错误的主要原因是NHibernate无法理解为什么要将DB字段映射两次。一次作为ForeignKey,另一次作为Primarykey。我也遇到了这个确切的问题-您找到解决方案了吗?提前感谢:]
public BankBranchMapping()
{
    CompositeId()
        .KeyReference(x => x.FinancialPeriodId, "FinancialPeriodRef")
        .KeyReference(x => x.SerialNumber, "SerialNumber");
    ...
}