Fluent nhibernate Fluent Nhibernate在提交()时导致System.IndexOutOfRangeException

Fluent nhibernate Fluent Nhibernate在提交()时导致System.IndexOutOfRangeException,fluent-nhibernate,mapping,Fluent Nhibernate,Mapping,你好。几天来,我一直在试图弄清楚如何使用NH和FluentNH配置映射,我想我差不多做到了,但还不完全做到。我有以下问题 我需要做的是基本上映射这两个实体,它们是实际实体的简化版本 Airlines varchar2(3) airlineCode //PK varchar2(50) Aircraft varchar2(3) aircraftCode //composite PK varchar2(3) airlineCode //composite PK, FK referencing PK

你好。几天来,我一直在试图弄清楚如何使用NH和FluentNH配置映射,我想我差不多做到了,但还不完全做到。我有以下问题

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

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;
}
class航空公司
{
字符串航空代码;
字符串名称;
IList舰队;
}
等级飞机
{
航空公司;
字符串飞机代码;
字符串航空器名称;
}
使用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");
航线图
表(“航空公司”);
Id(x=>x.AirlineCode);
Map(x=>x.AirlineName);
HasMany(x=>x.Fleet)
.KeyColumn(“航空公司”);
飞机图
表(“飞机”);
复合ID()
.KeyProperty(x=>x.AircraftCode)
.KeyReference(x=>x.Airline);
地图(x=>x.AircraftName);
参考(x=>x.Airline)
.栏(“航空公司”);
使用Nunit,我正在测试另一个飞机的添加,但在调用transaction.Commit after session.Save(飞机)时,我得到一个异常:“System.IndexOutOfRangeException:此OracleParameterCollection的无效索引22,计数=22。”飞机类(和表)有22个属性


有人有什么想法吗?

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

生成的唯一Sql用于选择航空公司。在CanadaAircraft()的NUnit测试中,我有IAircraftRepository repo=new AircraftRepository();飞机a=新飞机(Airline=new Airline{AirlineCode=“BAW”},AircraftCode=“752”};repo.AddAircraft(a);存储库方法为public void AddAircraft(飞机a){使用(ISession session=Helper.OpenSession()){使用(ITransaction tx=session.BeginTransAction()){session.Save(a);tx.Commit();}}