如何处理 NHibernate 方法 Flush 中引发的异常?我有一个删除对象的操作。它使用发布的 id 和调用从存储库加载对象repository.Delete(obj)
。
撇开我在 NHibernate 中的映射不完整并且删除导致“DELETE 语句与 REFERENCE 约束冲突”异常不谈,这是为这种情况实现异常处理的好案例。
所以在 Flush 中抛出异常,在 UnitOfWorkPerRequestTask 中调用 Flush,这是在每个请求上创建和销毁的任务,它启动并刷新 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
感谢帮助。