ArgumentOutOfRangeException Свободные сопоставления экспорта NHibernate - PullRequest
1 голос
/ 01 сентября 2011

Во-первых, я чрезвычайно новичок в использовании NHibernate и Fluent NHibernate, поэтому очень вероятно, что я совершаю простую ошибку. За последние несколько дней я сразу перешел в NHibernate, используя Fluent NHibernate с самого начала, поэтому у меня также нет опыта работы с файлами сопоставления NHibernate XML.

У меня есть один простой объект Student, который имеет несколько свойств, таких как Name, BirthDate, Gender, Version и т. Д. Первым шагом является получение максимального номера версии из базы данных. Поскольку я просто хочу, чтобы это работало, я только сопоставил это 1 свойство.

Я создаю SessionFactory здесь:

sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(
            Settings.ConnectionString))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Student>()
        .ExportTo(@"C:\Temp"))
    .BuildSessionFactory();

Я сопоставляю студента здесь (как я уже говорил, в настоящее время я просто пытаюсь завершить первый шаг, который извлекает максимальный номер версии. В настоящее время я не сопоставляю другие свойства объекта. Ниже точно как выглядит мой класс отображения.):

public class StudentMap : ClassMap<Student>
{
    public StudentMap()
    {
        Table("StudentVersion");
        Map(x => x.Version).Column("Version");
    }
}

Я звоню в NHibernate здесь:

public long GetMaxVersion()
{
    using (ISession session = sessionFactory.OpenSession())
    {
        long maxVersion = 0;
        if(session.Query<Student>().Any())
            maxVersion = session.Query<Student>().Max(s => s.Version);
        return maxVersion;
    }
}

Я тоже пробовал вот это:

public long GetMaxVersion()
{
    using (ISession session = sessionFactory.OpenSession())
    {
        return session.Query<Student>().Max(s => s.Version);
    }
}

В качестве примечания, оглядываясь назад на мой вызов BuildSessionFactory (), я прошу Fluent NHibernate экспортировать сопоставления xml в папку C: \ Temp, но это не происходит вообще, независимо от того, какую папку я спрашиваю это экспортировать в (да, безопасность установлена ​​правильно). Я просто предполагаю, что это происходит, потому что Fluent NHibernate даже не может закончить сопоставления? Я не знаю.

В любом случае, всякий раз, когда я совершаю любой из вызовов NHibernate, я получаю следующее исключение:

System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at System.Collections.Generic.List`1.get_Item(Int32 index)
at System.Collections.Generic.List`1.System.Collections.IList.get_Item(Int32 index)
at NHibernate.Linq.NhQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs: line 98
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs: line 28
at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs: line 103
at System.Linq.Queryable.Max(IQueryable`1 source, Expression`1 selector)
at Integration.Data.MaxVersion.StudentMaxVersionRetriever.GetMaxVersion()

Последние 4 часа я потратил на поиски в Google, и практически ВСЕ, что я обнаружил, утверждает, что это происходит, когда два свойства сопоставляются одному и тому же имени столбца. Мне не удалось экспортировать XML-файлы сопоставления NHibernate, но я не понимаю, как это будет в моей ситуации. В настоящее время я сопоставляю только 1 свойство и не использую автоматическое сопоставление, поэтому, насколько я понимаю, NHibernate должен пытаться сопоставить только 1 свойство с 1 столбцом, и все.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Ну, как я и подозревал, это оказалось ОЧЕНЬ простой ошибкой с моей стороны.Обидно, что я не получил сообщение об ошибке, которое имело бы какой-то смысл, но что угодно.

При создании фабрики сессий я звонил:

m => m.FluentMappings.AddFromAssemblyOf<Student>()

, но это должно (очевидно) быть:

m => m.FluentMappings.AddFromAssemblyOf<StudentMap>()

Глупая ошибка, но, надеюсь, это поможет кому-то еще.

1 голос
/ 01 сентября 2011
  1. Попробуйте убрать звонок на ExportTo(). В настоящее время в Fluent NHibernate есть ошибка, которая может создавать неправильные отображения при экспорте файлов.
  2. Каждой сущности NHibernate требуется идентификатор (первичный ключ таблицы). Создайте свойство Id и сопоставьте его.
  3. В вашей трассировке стека есть NhQueryProvider. В текущей версии (3.2.0.GA) этот класс называется DefaultQueryProvider. Вы можете попробовать обновить до текущей версии. Затем вы должны использовать транковую версию Fluent NHibernate (версия выпуска еще не обновлена ​​до NHibernate 3.2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...