Во-первых, я чрезвычайно новичок в использовании 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 столбцом, и все.
Заранее спасибо за любую помощь.