ArgumentOutOfRangeException流畅的NHibernate导出映射

时间:2011-09-01 07:07:22

标签: c# nhibernate fluent-nhibernate nhibernate-mapping linq-to-nhibernate

首先,我使用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列,就是这样。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

好吧,正如我所怀疑的那样,事实证明这是一个非常简单的错误。令人沮丧的是,我没有收到任何有意义的错误信息,无论如何。

在建立会话工厂时,我打电话:

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

但它(显然)应该是:

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

愚蠢的错误,但希望这有助于其他人。

答案 1 :(得分:1)

  1. 尝试删除对ExportTo()的调用。目前,Fluent NHibernate中存在一个错误,可能会在导出文件时创建错误的映射。
  2. 每个NHibernate实体都需要一个Id(表的主键)。创建一个Id属性并映射它。
  3. 堆栈跟踪中有NhQueryProvider。在当前版本(3.2.0.GA)中,此类名为DefaultQueryProvider。您可以尝试更新到当前版本。然后你必须使用Fluent NHibernate的trunk版本(发布版本还没有更新到NHibernate 3.2)。
相关问题