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