0

如何处理 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

感谢帮助。

4

1 回答 1

1

如果在 UnitOfWork 中调用 Flush(),则只能捕获错误并记录它。

如果您希望您的用户通知错误,请关闭事务或更早地执行 Flush(如 Paco 和 cbp 的评论中所述)。一个地方是在您的操作方法中处理它。检查结果并将其报告给带有错误页面的用户。

于 2010-08-16T16:41:18.777 回答