Вопрос

Как я могу справиться с исключением, который брошен в метод 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). Одно место - это обработать его в вашем методе действий. Проверьте результат и сообщите ему пользователю с страницей ошибки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top