2009-09-18 78 views
0

嘿。我一直试图弄清楚如何配置NH和FluentNH的映射几天,我想我几乎在那里,但不是很完美。我有以下问题。Fluent Nhibernate在Commit()上导致System.IndexOutOfRangeException

我需要做的是基本上映射这两个实体,它们是实际简化版本。

Airlines 
varchar2(3) airlineCode //PK 
varchar2(50) 

Aircraft 
varchar2(3) aircraftCode //composite PK 
varchar2(3) airlineCode //composite PK, FK referencing PK in Airlines 
varchar2(50) aircraftName 

我的课看起来像

class Airline 
{ 
    string AirlineCode; 
    string AirlineName; 
    IList<Aircraft> Fleet; 
} 

class Aircraft 
{ 
    Airline Airline; 
    string AircraftCode; 
    string AircraftName; 
} 

使用FluentNH,我映射它像这样

AirlineMap 
    Table("Airlines"); 
    Id(x => x.AirlineCode); 
    Map(x => x.AirlineName); 
    HasMany<Aircraft>(x => x.Fleet) 
     .KeyColumn("Airline"); 

AircraftMap 
    Table("Aircraft"); 
    CompositeId() 
     .KeyProperty(x => x.AircraftCode) 
     .KeyReference(x => x.Airline); 
    Map(x => x.AircraftName); 
    References(x => x.Airline) 
     .Column("Airline"); 

使用NUnit,我测试加入另一架飞机,但在调用交易。在session.Save(飞机)之后提交,我收到一个异常:“System.IndexOutOfRangeException:此Count为22的OracleParameterCollection的索引22无效。”飞机类(和表)有22个属性。

任何人有任何想法?

回答

0

问题是,NHibernate生成的查询不能正确匹配您的一个表的要求。根据所提供的信息,我无法完全推断出正在发生的事情。在构建FluentConfiguration对象期间,将ShowSql()添加到OracleClientConfiguration中。然后在NUnit中再次运行测试,并注意生成的Sql将在控制台窗口中。它应该给你一个很好的起点,看看底下实际发生了什么。如果这没有帮助,请将Sql带回来看看。

+0

唯一生成的Sql用于选择航空公司。 (),我有 IAircraftRepository repo = new AircraftRepository();我有 在我的NUnit测试CanAddAircraft(), 飞机=飞机新(航空=新航空公司{AirlineCode = “BAW”},AircraftCode = “752”}; repo.AddAircraft(一); 存储库的方法是 公共无效AddAircraft(飞机一个) { 使用(ISession的会话= Helper.OpenSession()){ 使用 (ITransaction TX = session.BeginTransAction()){ session.Save(一); tx.Commit();} } } – Moss 2009-09-21 10:11:35