Беглый Nhibernate вызывает System.IndexOutOfRangeException в Commit () - PullRequest
0 голосов
/ 18 сентября 2009

Привет. Я пытался выяснить, как настроить сопоставление с 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;
}

Используя 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, я тестирую добавление другого самолета, но после вызова транзакции. Примите после сеанса. Спасение (самолет), я получаю исключение: «System.IndexOutOfRangeException: недопустимый индекс 22 для этой OracleParameterCollection с Count = 22 «. Класс Aircraft (и таблица) имеет 22 свойства.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 18 сентября 2009

Проблема в том, что NHibernate генерирует запрос, который не соответствует требованиям одной из ваших таблиц. Я не могу понять, что происходит на основе предоставленной информации. Добавьте ShowSql () в OracleClientConfiguration во время создания объекта FluentConfiguration. Затем снова запустите тест в NUnit и обратите внимание, что сгенерированный Sql будет в окне консоли. Это должно дать вам хорошую отправную точку, чтобы увидеть, что на самом деле происходит под капотом. Если это не поможет, верните Sql для SO.

...