2009-09-18 61 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