Волшебная строка вызывает ошибку в nHibernate Profiler
У меня есть бизнес-приложение, за которое я отвечаю, и эта периодически возникающая ошибка появляется при создании новых комментариев. Я наконец-то получил точную строку, которая его вызывает, и после того, как я медленно сужаю абзац текста до точной части, вызывающей его, я сузил его до базовых компонентов. Но я не могу исправить это, за исключением повсеместного применения пластырей. Я хотел посмотреть, является ли это общей проблемой, и возможно получить некоторую обратную связь по этому вопросу.
Я использую Fluent nHibernate (1.3.0.773) и nHibernate (3.3.1.400), я также сократил свой файл сопоставления, поэтому убедитесь, что это не потому, что это так просто, как я мог бы получить, и по-прежнему воспроизводить ошибку (и иметь работоспособную сборку). Это результирующий контент для комментариев при использовании FluentMappings.ExportTo()
чтобы сбросить конфигурацию.
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class xmlns="urn:nhibernate-mapping-2.2" name="Core.Comment, Core, Version=5.0.4720.19853, Culture=neutral, PublicKeyToken=null" table="tblComments">
<id name="CommentId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="CommentId" />
<generator class="guid.comb" />
</id>
<property name="OwnerId" type="System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="OwnerId" />
</property>
<property name="Text" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Description" />
</property>
</class>
</hibernate-mapping>
Это довольно просто, но если в представленном тексте есть апостроф, то после слова "обновление" и закрывающей скобки я получаю ArgumentOutOfRangeException
ошибка при попытке совершить транзакцию.
Следующие строки вызывают проблему
- Lorem Ipsum Dolor Sit Amet, Concetetur. (Это не обновляет)
- Тоже не обновляется)
- 'Обновить)
Это не вызывает проблемы
- Lorem Ipsum Dolor Sit Amet, Concetetur. (Это обновление)
- Обновить)
- 'Обновить
- "Обновит)
Любое понимание, которое вы можете дать, было бы замечательно.
ОБНОВЛЕНИЕ: я должен упомянуть, что когда я подключил nHibernate Profiler к этому, не было никакого сгенерированного SQL, связанного со вставкой новой записи. Итак, я предполагаю, что это из какой-то логики внутри nHibernate?
Трассировки стека
[ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index]
System.ThrowHelper.ThrowArgumentOutOfRangeException() +72
System.Collections.Generic.List`1.get_Item(Int32 index) +34
NHibernate.AdoNet.Util.FormatProcess.CloseParen() +141
NHibernate.AdoNet.Util.FormatProcess.Perform() +452
NHibernate.AdoNet.Util.BasicFormatter.Format(String source) +67
NHibernate.AdoNet.SqlClientBatchingBatcher.AddToBatch(IExpectation expectation) +310
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) +914
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) +341
NHibernate.Action.EntityInsertAction.Execute() +371
NHibernate.Engine.ActionQueue.Execute(IExecutable executable) +48
NHibernate.Engine.ActionQueue.ExecuteActions(IList list) +128
NHibernate.Engine.ActionQueue.ExecuteActions() +35
NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) +156
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) +180
NHibernate.Impl.SessionImpl.Flush() +295
NHibernate.Transaction.AdoTransaction.Commit() +189
Web.Filters.NHibernateActionFilter.OnActionExecuted(ActionExecutedContext filterContext) in c:\Development\[Project Folder]\Web.Controllers\Filters\NHibernateActionFilter.cs:82
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +354
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +323
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +323
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +44
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +74
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +68
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +184
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +136
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +66
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +40
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +68
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +65
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +45
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +66
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629708
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
2 ответа
Итак, я выяснил, что это вызвало. Как только я удалил инициализацию nHibernate Profiler из моего проекта, ошибка перестала возникать. Должно быть, он пытался отформатировать строку для записи в журнал перед ее выполнением - и, поскольку она взорвалась, ему так и не удалось выполнить запрос. Что для меня неправильно, ведение журнала должно поглотить ошибки или, по крайней мере, не допустить, чтобы они мешали нормальной работе.
Обновление: та же проблема возникает, когда используется nHibernate Profiler 2, но как только я закомментирую NHibernateProfiler.Initialize()
, проблема уходит. Посмотрим, смогу ли я получить поддержку от разработчика. Обратите внимание, что вам на самом деле не нужно присоединять свой процесс с помощью nHibernate Profiler, достаточно просто инициализировать профилировщик, чтобы вызвать проблему. Я попытался связаться со службой поддержки nHibernate Profiler по электронной почте 5 декабря и пока ничего не слышал, поэтому я не знаю, рассматривалось ли это еще или нет.
Поскольку это один из основных вопросов, которые всплывают при поиске в Интернете с точным сообщением об ошибке, я подумал, что людям будет полезно узнать, как я его исправил.
Трассировка стека ошибок, упомянутая в вопросе, на самом деле создается NHibernate BasicFormatter. Для этой ошибки существует задокументированная проблема в репозитории NHibernate GitHub. Вот ссылка - https://github.com/nhibernate/nhibernate-core/issues/1319.
Ошибка была исправлена в последней версии NHibernate на момент написания этого ответа. Для более старых версий, таких как 3.1.0 (версия, с которой я работал, когда столкнулся с ошибкой), установка
format_sql
свойство ложно в
nhibernate.config
файл устраняет проблему.