首页 文章

ArgumentOutOfRangeException流畅的NHibernate导出映射

提问于
浏览
1

首先,我使用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文件夹,但这根本不会发生,无论我要求它导出哪个文件夹to(是的,安全性设置正确) . 我只是猜测这种情况正在发生,因为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 回答

  • 1

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

    在 Build 会话工厂时,我打电话给:

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

    但它(显然)应该是:

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

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

  • 2
    • 尝试删除对 ExportTo() 的调用 . 目前,Fluent NHibernate中存在一个错误,可能会在导出文件时创建错误的映射 .

    • 每个NHibernate实体都需要一个Id(表的主键) . 创建Id属性并映射它 .

    • 堆栈跟踪中有 NhQueryProvider . 在当前版本(3.2.0.GA)中,此类名为 DefaultQueryProvider . 您可以尝试更新到当前版本 . 然后你必须使用Fluent NHibernate的trunk版本(发布版本还没有更新到NHibernate 3.2) .

相关问题