首先,我使用NHibernate和Fluent NHibernate非常新,所以我很可能犯了一个简单的错误。我在最近几天使用Fluent NHibernate直接进入NHibernate,所以我也没有处理NHibernate XML映射文件的经验。
我有一个简单的Student对象,它有一些属性,如Name,BirthDate,Gender,Version等。第一步是从数据库中检索最大版本号。因为我只想让它工作,我只映射了那个属性。
我在这里创建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个小时谷歌搜索和几乎EVEYRTHING我发现当两个属性映射到同一列名称时会发生这种情况。我一直没有成功导出NHibernate映射XML文件,但我无法看到在我的情况下会出现这种情况。我目前只映射1个属性而且我没有使用任何自动化,所以从我的理解,NHibernate应该只尝试将1个属性映射到1列,就是这样。
提前感谢您的帮助。
答案 0 :(得分:2)
好吧,正如我所怀疑的那样,事实证明这是一个非常简单的错误。令人沮丧的是,我没有收到任何有意义的错误信息,无论如何。
在建立会话工厂时,我打电话:
m => m.FluentMappings.AddFromAssemblyOf<Student>()
但它(显然)应该是:
m => m.FluentMappings.AddFromAssemblyOf<StudentMap>()
愚蠢的错误,但希望这有助于其他人。
答案 1 :(得分:1)
ExportTo()
的调用。目前,Fluent NHibernate中存在一个错误,可能会在导出文件时创建错误的映射。NhQueryProvider
。在当前版本(3.2.0.GA)中,此类名为DefaultQueryProvider
。您可以尝试更新到当前版本。然后你必须使用Fluent NHibernate的trunk版本(发布版本还没有更新到NHibernate 3.2)。