Reputation: 33
Consider following mapping code please :
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" });
}
}
And the BankBranch
mapping code is :
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" });
}
}
As you can see the FinancialPeriodRef
field acts as foreign key and part of composite key in the BankBranch
mapping and NHibernate builds DB correctly and everything seems to be fine until I try to insert a record in the BankBranch
table.
The error System.IndexOutOfRangeException : Invalid index 10 for this SqlParameterCollection with Count=10.
which indicates I've mapped a field (FinancialPeriodRef
) twice as FK and PK appears and I have no idea how to fix the problem.
I need FinancialPeriodRef
in the BankBranch
as part of primary key while it's absolutely equal to FinancialPeriodRef
from Bank
.
I need this field to establish unique constraint and also benefits of composite key is essential.
Upvotes: 3
Views: 3239
Reputation: 31760
You need to use KeyReference rather than KeyProperty to describe composite foreign keys.
public BankBranchMapping()
{
CompositeId()
.KeyReference(x => x.FinancialPeriodId, "FinancialPeriodRef")
.KeyReference(x => x.SerialNumber, "SerialNumber");
...
}
I had the exact same problem as you and after an hour or so came across this post: https://stackoverflow.com/a/7997225/569662 which pointed me right.
Upvotes: 5