NHibernate System.IndexOutOfRangeException

mod*_*bie 13 nhibernate

我有一个非常简单的类,它给出了一个奇怪的错误.该类只有1个属性,查询非常简单.最棘手的部分是,这似乎是随机发生的.在收到此错误后,通常刷新页面会使其成为一种方式,应用程序不会再次出现错误.

这可能是数据库连接的问题吗?

我越来越:

[IndexOutOfRangeException: Department5_]
   System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) +4839010
   System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) +67
   NHibernate.Driver.NHybridDataReader.GetOrdinal(String name) +46
   NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) +87
   NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) +62
   NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, IEntityPersister persister, Object id, IDataReader rs, ISessionImplementor session) +213
   NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) +301
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +1422
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +114
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +205

[ADOException: could not execute query
[ select department0_.Department as Department5_ from tblDepartments department0_ where department0_.Department like 'CBS - %' ]
[SQL: select department0_.Department as Department5_ from tblDepartments department0_ where department0_.Department like 'CBS - %']]
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +383
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +52
   NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) +183
   NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) +102
   NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) +684
   NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) +816
   NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) +277
   NHibernate.Impl.SessionImpl.List(String query, QueryParameters parameters) +235
   NHibernate.Impl.QueryImpl.List() +224
   DispatchBoard.Models.Repository.Find(String hql) +76
   DispatchBoard.Controllers.HomeController.Filter() +48
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
   System.Web.Mvc.Controller.ExecuteCore() +126
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
Run Code Online (Sandbox Code Playgroud)

这是我的课

public class Department : IObject {
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

hbm文件

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="DispatchBoard.Models.Department, DispatchBoard" table="tblDepartments">
        <id name="Name" column="Department" type="String" length="50">
            <generator class="assigned" />
        </id>

    </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

这是HQL查询

var hql = "from Department d where d.Name like 'CBS - %'";
_session.CreateQuery(hql).List<T>();
Run Code Online (Sandbox Code Playgroud)

Ste*_*ger 13

通常,当您获得IndexOutOfRangeExceptionNHibernate时,这是因为您将属性映射了两次,或者将两个属性映射到同一列.检查列名称.

它可能是随机发生的,因为冲突只出现在某个数据星座中.


Oli*_*ver 7

我们 - 和其他人 - 最近和过去也遇到过这个问题.它似乎与非线程安全的多线程访问有关SqlConnection.以下真正长(!)的帖子包含更多示例和更多有关该问题的详细信息:SQLDataReader.GetOrdinal()很少使用IndexOutOfRange失败.有bbzippo说:

"很明显,SqlDataReader读取几秒前在同一连接上执行的上一个查询遗留下来的结果集."

不幸的是,我没有找到任何真正的解释为什么这个异常突然发生在一段时间没有问题的代码中.

在给定的主题中提出的一些建议是:

  1. 关闭连接池,所以你的连接字符串看起来像"Data Source=Sql2005;Initial Catalog=MyDbName;User Id=MyLogin;Password=MyPass;Pooling=false"(例如,这很可能意味着你的应用程序会遇到性能损失,但肯定会工作)
  2. 重构static引用您的SqlConnection实例的所有代码non-static
  3. 修复对SqlConnections的可能的多线程访问(这可能不那么容易......)

我仍然试图在我们的应用程序中找到错误的来源,但这并不容易,因为我无法在我们的实时环境之外重现它.Matt Neerincx [MSFT]在上述帖子中的一个答案建议使用不同的连接字符串,从而为应用程序的不同部分使用不同的连接池,以帮助缩小问题的根源.

关于这个问题我发现的另一个读法是在hibernate论坛上:https://forum.hibernate.org/viewtopic.php?p = 2386963,其中一张海报在多线程场景中也存在延迟加载问题.

希望这将指导任何人在正确的方向上进行修复.

奥利弗

PS这是我对Nhibernate FieldNameLookup的回答的副本抛出IndexOutOfRangeException