请考虑以下映射代码:
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}}。
我需要此字段来建立唯一约束,并且复合键的好处也是必不可少的。
答案 0 :(得分:3)
您需要使用KeyReference而不是KeyProperty进行映射,这也是FK。
public BankBranchMapping()
{
CompositeId()
.KeyReference(x => x.FinancialPeriodId, "FinancialPeriodRef")
.KeyReference(x => x.SerialNumber, "SerialNumber");
...
}
我遇到了与你完全相同的问题,经过一个小时左右的时间发现了这篇帖子:https://stackoverflow.com/a/7997225/569662它指出了我的意思。