NHibernate 3.1 NHibernate.Linq.Исключение NhRelinqQueryParser «Последовательность содержит более одного совпадающего элемента»

#c# #nhibernate

#c# #nhibernate

Вопрос:

Я использую 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:CSharpNHNHnhibernatesrcNHibernateLinqNhLinqExpression.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:CSharpNHNHnhibernatesrcNHibernateHqlAstANTLRASTQueryTranslatorFactory.cs:line 27
       at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:CSharpNHNHnhibernatesrcNHibernateEngineQueryHQLExpressionQueryPlan.cs:line 34
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:CSharpNHNHnhibernatesrcNHibernateEngineQueryHQLExpressionQueryPlan.cs:line 23
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in d:CSharpNHNHnhibernatesrcNHibernateEngineQueryHQLExpressionQueryPlan.cs:line 21
       at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) in d:CSharpNHNHnhibernatesrcNHibernateEngineQueryQueryPlanCache.cs:line 88
       at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in d:CSharpNHNHnhibernatesrcNHibernateImplAbstractSessionImpl.cs:line 312
       at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in d:CSharpNHNHnhibernatesrcNHibernateImplAbstractSessionImpl.cs:line 268
       at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQueryamp; query, NhLinqExpressionamp; nhQuery) in d:CSharpNHNHnhibernatesrcNHibernateLinqNhQueryProvider.cs:line 43
       at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) in d:CSharpNHNHnhibernatesrcNHibernateLinqNhQueryProvider.cs:line 26
       at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) in d:CSharpNHNHnhibernatesrcNHibernateLinqNhQueryProvider.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:xxx.Persistence.NHNHibernateUnitOfWork.cs:line 71
       at x.Persistence.NH.NHibernateUnitOfWork.Transactional[TResult](Func`1 func) in D:xxx.Persistence.NHNHibernateUnitOfWork.cs:line 88
       at x.Persistence.NH.NHibernateUnitOfWork.FindOne[T](Expression`1 predicate) in D:xxx.Persistence.NHNHibernateUnitOfWork.cs:line 71
       at Sample.Sam.Start() in D:xxSampleSam.cs:line 28
       at Sample.Sam.Main() in D:xxSampleSam.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:CSharpNHNHnhibernatesrcNHibernateLinqNhRelinqQueryParser.cs:line 26
       InnerException: 
  

Комментарии:

1. возможно, вы захотите показать значение «предиката»

Ответ №1:

в моей команде мы имеем ту же ошибку, используя те же версии NHibernate и fluentnhibernate, в любом случае, эта ошибка появляется только на одной машине (из 8). Похоже, проблема присуща отладке Visual studio, тот же проект выполняется нормально, если запущен вне Visual Studio или если процесс отладки выполняется путем подключения процесса из меню Debug. Я проведу расследование по этому вопросу как можно скорее, но в данный момент отладка с этого компьютера выполняется косвенно, как показано выше. Кроме того, этот запрос http://www.mail-archive.com/nhusers@googlegroups.com/msg25959.html кажется интересной.

Комментарии:

1. Более подробная информация здесь: groups.google.com/group/re-motion-users/browse_thread/thread /… . Вероятно, проблема, возникшая в NH3.1.

2. Я знаю оба этих сообщения. Когда я использую приведенный выше код; в testdriven.net у меня нет проблем, но resharper, mstest, консольное приложение, приложение winform я всегда получаю одну и ту же ошибку.

3. У меня та же проблема при запуске нескольких проектов запуска и отладке. Запуск без отладки моего запроса LINQ работает нормально…

Ответ №2:

У одного из членов команды возникла эта проблема только при отладке с помощью VSDEV.

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

Комментарии:

1. Отключение IntelliTrace устранило проблему для нас.

Ответ №3:

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

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

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

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

-Диего

Ответ №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 сейчас, не получая того же исключения (по крайней мере, я сделал).