Как обработать исключение в фазе сброса? - PullRequest
0 голосов
/ 16 августа 2010

как я могу обработать исключение, которое выбрасывается в методе NHibernate Flush?У меня есть действие для удаления объектов.Он загружает объекты из репозитория, используя опубликованные идентификаторы и вызовы repository.Delete(obj).

. Оставляя в стороне то, что мое отображение в NHibernate не завершено, и удаление приводит к исключению «Оператор DELETE, конфликтующий с ограничением REFERENCE», это хорошоcase для реализации хедлинга исключений для этого случая.

Таким образом, исключение выдается в Flush, а Flush вызывается в UnitOfWorkPerRequestTask, который создается и уничтожается при каждом запросе, запускается и сбрасывает UnitOfWork (Rhino.Commons.UnitOfWork).Эта задача зарегистрирована с использованием контейнера Windsor и LifestyleType.Transient и вызывается HttpApplication внутри методов Begin и EndRequest.

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

Здесь трассировка стека исключений (не полная):

NHibernate.Transaction.AdoTransaction.Commit() +212
Rhino.Commons.NHibernateTransactionAdapter.Commit() +33
Rhino.Commons.BaseUnitOfWorkFactory.TransactionalFlush(IsolationLevel isolationLevel) +116
Rhino.Commons.BaseUnitOfWorkFactory.TransactionalFlush() +35
Cereal.Mvc.DataModule.Tasks.UnitOfWorkPerRequestTask.DisposeCore() in C:\projects\Sample\Cereal.Mvc.DataModule\Tasks\UnitOfWorkPerRequestTask.cs:33
System.Web.Mvc.Extensibility.Disposable.Dispose(Boolean disposing) in C:\projects\System.Web.Mvc.Extensibility\Abstraction\Disposable.cs:52
System.Web.Mvc.Extensibility.Disposable.Dispose() in C:\projects\System.Web.Mvc.Extensibility\Abstraction\Disposable.cs:35
Castle.MicroKernel.LifecycleConcerns.DisposalConcern.Apply(ComponentModel model, Object component) +47
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ApplyConcerns(Object[] steps, Object instance) +129
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ApplyDecommissionConcerns(Object instance) +106
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalDestroy(Object instance) +37
Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Destroy(Object instance) +37
Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Release(Object instance) +48
Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleManager.Evict(Object instance) +38
Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule.Application_EndRequest(Object sender, EventArgs e) +305
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

Спасибо за помощь.

1 Ответ

1 голос
/ 16 августа 2010

Если вы вызываете Flush () в UnitOfWork, вы можете только перехватить ошибку и записать ее в журнал.

Если вы хотите, чтобы ваши пользователи сообщали об ошибке, закройте транзакцию или выполните команду Flush ранее (какуказано в комментариях Пако и КБП).Одно место - это справиться с этим в вашем методе действий.Проверьте результат и сообщите его пользователю на странице ошибки.

...