Подтвердить что ты не робот

NHibernate 3.1 NHibernate.Linq.NhRelinqQueryParser exception "Последовательность содержит более одного соответствующего элемента"

Я использую 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: 
4b9b3361

Ответ 1

в моей команде мы имеем ту же ошибку, используя те же версии nHibernate и fluentnhibernate, в любом случае эта ошибка появляется только на одной машине (из 8). Кажется, что проблема связана с отладкой visual studio, тот же проект отлично работает, если он запускается за пределами визуальной студии, или если процесс отладки выполняется путем присоединения процесса из меню Debug. Я буду исследовать это как можно скорее, но в этот момент отладка с этого ПК выполняется косвенно, как показано выше. Кроме того, этот запрос http://www.mail-archive.com/[email protected]/msg25959.html кажется интересным.

Ответ 2

Один из членов команды имел эту проблему только после отладки с VSDEV.

После отключения IntelliTrace исправлена ​​эта проблема.

Ответ 3

Я боролся с этой проблемой еще пару дней, пытаясь понять, почему в мире я был единственным в моей команде, получившим эту ошибку.

Я не совсем уверен в всех путях, которые я взял, однако в моем случае это оказалось ошибкой привилегий, даже несмотря на то, что мой домен был администратором в локальном поле, и я полностью запускал все доверие и UAC отключены.

Трюк, который сделал это для меня, состоял в том, чтобы полностью удалить мой профиль окна и снова создать его. Я понятия не имею, что в профиле вызывало проблему, но это сработало для меня.

Надеюсь, что это поможет

-Diego

Ответ 4

Проверяйте свои настройки intellitrace!

Для меня это работает, когда выбраны только события IntelliTrace. Когда у меня есть события IntelliTrace и выбранная информация о вызове, я получаю ошибку nhibernate.

Ответ 5

У меня была эта же проблема, это происходит только тогда, когда я пытаюсь использовать библиотеку NHibernate.Linq. (Я использую NHibernate 3.1 и NHibernate.Linq 1.0). Я не хотел потерять возможность отладки моего приложения в Visual Studio, поэтому вместо этого я преобразовал NHibernate.Linq в API NHibernate QueryOver, который похож на Linq, но на самом деле не использует его.

Итак, для вашего примера кода вы можете изменить это:

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

Вместо использования QueryOver:

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

Если вы это сделаете, вы должны иметь возможность отлаживать в Visual Studio сейчас, не получая того же исключения (по крайней мере, я это сделал).