考虑下面的映射代码,请:共享领域,如功能NHibernate复合键和外键
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出现,我不知道如何解决问题。
我需要在BankBranch
中的FinancialPeriodRef
作为主键的一部分,而它绝对等于从Bank
的FinancialPeriodRef
。
我需要这个字段来建立唯一的约束,组合键的好处也是必不可少的。
不确定究竟是什么可能导致您的问题,但'BankBranchMapping'类映射可能不是你想要的。看看如何在这个[SO问题和接受的答案]中使用'KeyReference'方法(http://stackoverflow.com/questions/3997114/how-to-map-composite-id-with-fluent-nhibernate-using-的接口)。使用'KeyReference',你可以从地图上删除'References(...'),并且确保从属类(例如'Bank'等)的Id生成设置正确 – 2013-02-21 15:13:00
我使用[KeyReference]代替但是问题仍然没有解决,导致错误的主要原因是NHibernate无法理解为什么你要映射一个数据库字段两次,一次作为ForeignKey,再次作为Primarykey。 – 2013-02-27 07:14:18
我也有这个确切的问题 - 没有你设法找到解决办法?提前致谢:] – 2014-08-14 07:59:56