【问题标题】:NHibernate 3.1 NHibernate.Linq.NhRelinqQueryParser exception "Sequence contains more than one matching element"NHibernate 3.1 NHibernate.Linq.NhRelinqQueryParser 异常“序列包含多个匹配元素”
【发布时间】:2011-05-13 15:04:37
【问题描述】:

我正在使用 Nhibernate 3.1 / FluentNhibernate 1.2

当我使用 CTRL + F5 在发布模式下工作时,我没有遇到任何异常。 但是在使用 F5 的调试模式下会出现以下异常:

一个控制台应用程序,用于此代码:

_Session.Query<Foo> ().Where (x=>x.Bar == "bar").FirstOrDefault()

例外:

System.TypeInitializationException was unhandled
  Message=The type initializer for 'NHibernate.Linq.NhRelinqQueryParser' threw an exception.
  Source=NHibernate
  TypeName=NHibernate.Linq.NhRelinqQueryParser
  StackTrace:
       at NHibernate.Linq.NhRelinqQueryParser.Parse(Expression expression)
       at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhLinqExpression.cs:line 65
       at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line 27
       at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 34
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 23
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:line 21
       at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\Query\QueryPlanCache.cs:line 88
       at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line 312
       at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\AbstractSessionImpl.cs:line 268
       at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 43
       at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 26
       at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:line 103
       at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
       at x.Persistence.NH.NHibernateUnitOfWork.<>c__DisplayClass11`1.<FindOne>b__10() in D:\x\x\x.Persistence.NH\NHibernateUnitOfWork.cs:line 71
       at x.Persistence.NH.NHibernateUnitOfWork.Transactional[TResult](Func`1 func) in D:\x\x\x.Persistence.NH\NHibernateUnitOfWork.cs:line 88
       at x.Persistence.NH.NHibernateUnitOfWork.FindOne[T](Expression`1 predicate) in D:\x\x\x.Persistence.NH\NHibernateUnitOfWork.cs:line 71
       at Sample.Sam.Start() in D:\x\x\Sample\Sam.cs:line 28
       at Sample.Sam.Main() in D:\x\x\Sample\Sam.cs:line 16
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.InvalidOperationException
       Message=Sequence contains more than one matching element
       Source=System.Core
       StackTrace:
            at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
            at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.Transformation.ExpressionTransformerRegistry.CreateDefault() in :line 0
            at NHibernate.Linq.NhRelinqQueryParser..cctor() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Linq\NhRelinqQueryParser.cs:line 26
       InnerException: 

【问题讨论】:

  • 你可能想显示“predicate”的值

标签: c# nhibernate


【解决方案1】:

在我的团队中,我们在使用相同版本的 nHibernate 和 fluentnhibernate 时遇到了同样的错误,无论如何,该错误只出现在一台机器上(共 8 台)。这似乎是 Visual Studio 调试固有的问题,如果在 Visual Studio 外部启动,或者如果调试过程是通过从“调试”菜单附加该过程来完成的,则相同的项目运行良好。我会尽快对此进行调查,但此时此电脑的调试是间接完成的,如上图所示。此外,这个请求http://www.mail-archive.com/nhusers@googlegroups.com/msg25959.html 似乎很有趣。

【讨论】:

  • 更多细节在这里:groups.google.com/group/re-motion-users/browse_thread/thread/…。可能是 NH3.1 中引入的问题。
  • 我知道这两个帖子。当我使用上面的代码时;在 testdriven.net 中我没有问题,但是 resharper、mstest、控制台应用程序、winform 应用程序我总是遇到同样的错误。
  • 在运行多个启动项目和调试时对我来说同样的问题。在不调试我的 LINQ 查询的情况下运行正常...
【解决方案2】:

其中一位团队成员仅在使用 VSDEV 进行调试时遇到此问题。

在我们关闭 IntelliTrace 后解决了这个问题。

【讨论】:

  • 关闭 IntelliTrace 为我们解决了这个问题。
【解决方案3】:

我也为这个问题纠结了几天,试图弄清楚为什么我是团队中唯一遇到这个错误的人。

我并不完全确定我采用的所有路径,但是,在我的情况下,结果证明是权限错误,即使我的域登录是本地机器上的管理员,并且我正在完整运行所有内容信任,并且 UAC 已关闭。

为我做这件事的诀窍是完全删除我的 Windows 配置文件并重新创建它。我不知道配置文件中的什么导致了这个问题,但它对我有用。

希望对你有帮助

-迭戈

【讨论】:

    【解决方案4】:

    检查您的智能跟踪设置!

    对我来说,它仅在选择 IntelliTrace 事件时有效。 当我选择了 IntelliTrace 事件和呼叫信息时,我得到了休眠错误。

    【讨论】:

      【解决方案5】:

      我也遇到过同样的问题,只有当我尝试使用 NHibernate.Linq 库时才会出现这种情况。 (我使用的是 NHibernate 3.1 和 NHibernate.Linq 1.0)。我不想失去在 Visual Studio 中调试我的应用程序的能力,所以我将 NHibernate.Linq 调用转换为 NHibernate QueryOver API,它类似于 Linq,但实际上并没有使用它。

      因此,对于您的代码示例,您可以更改:

      _Session.Query<Foo>().Where(x => x.Bar == "bar").FirstOrDefault();
      

      改为使用 QueryOver:

      _Session.QueryOver<Foo>().Where(x => x.Bar == "bar").List().FirstOrDefault();
      

      如果你这样做了,你现在应该可以在 Visual Studio 中进行调试,而不会出现同样的异常(至少我是这样)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        相关资源
        最近更新 更多