Как обрабатывать исключение в фазе Flush?
-
28-09-2019 - |
Вопрос
Как я могу справиться с исключением, который брошен в метод Nhibernate? У меня есть действие для удаления объектов. Он загружает объекты из репозитория с использованием размещенных идентификаторов и вызовов repository.Delete(obj)
.
Оставляя в стороне о том, что мое отображение в Nibernate не завершено, и удаление приводит к тому, что «Удалить оператор, противоречащее исключением ссылочного ограничения», это хороший случай для реализации исключения Aadling для этого случая.
Таким образом, исключение брошено в Flush, а в глубине вызывается в UnitOfWorkPerrequestSack, которая является задачей, созданной и уничтоженной на каждом запросе, и она запускается и вымывает UnitOfWork (Rhino.Commons.UnitOfWork
). Эта задача зарегистрирована с использованием контейнера Windsor и LifestyleType.Transient
И он называется httpapplication внутри начинающих и эндорексов.
Есть ли какие-то, как обрабатывать это исключение в моем удалении действий, поэтому я могу заметить пользователя, что этот объект не может быть удален из-за некоторых отношений?
Трассировка стека исключения здесь (не заполнена):
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
Спасибо за помощь.
Решение
Если вы вызовите Flush () в UnitOfWork, вы можете поймать ошибку только и входить в систему.
Если вы хотите, чтобы ваши пользователи информируют об ошибке, затем закройте транзакцию или выполните Flush Reflierer (как указано в комментариях PACO и CBP). Одно место - это обработать его в вашем методе действий. Проверьте результат и сообщите ему пользователю с страницей ошибки.