2013-02-21 76 views
2

考虑下面的映射代码,请:共享领域,如功能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作为主键的一部分,而它绝对等于从BankFinancialPeriodRef

我需要这个字段来建立唯一的约束,组合键的好处也是必不可少的。

+0

不确定究竟是什么可能导致您的问题,但'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

+0

我使用[KeyReference]代替但是问题仍然没有解决,导致错误的主要原因是NHibernate无法理解为什么你要映射一个数据库字段两次,一次作为ForeignKey,再次作为Primarykey。 – 2013-02-27 07:14:18

+0

我也有这个确切的问题 - 没有你设法找到解决办法?提前致谢:] – 2014-08-14 07:59:56

回答

2

您需要使用KeyReference而不是KeyProperty作为也是FK的映射。

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

我有完全相同的问题,因为你和一个小时后,或在这个帖子这么走过来:https://stackoverflow.com/a/7997225/569662其中指出我的权利。