如何在Flush阶段处理异常?

时间:2010-08-16 07:11:52

标签: asp.net-mvc nhibernate unit-of-work

如何处理NHibernate方法Flush中抛出的异常?我有删除对象的操作。它使用已发布的ID和repository.Delete(obj)来加载来自存储库的对象。

撇开我在NHibernate中的映射不完整而删除导致“DELETE语句与REFERENCE约束冲突”异常,这是为这种情况实现异常hadling的好例子。

因此,在Flush中抛出异常,并在UnitOfWorkPerRequestTask中调用Flush,这是在每个请求上创建和销毁的任务,它启动并刷新UnitOfWork(Rhino.Commons.UnitOfWork)。此任务使用Windsor容器和LifestyleType.Transient注册,并由Begin和EndRequest方法中的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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

如果您希望用户通知错误,请关闭交易或执行Flush earlierer(如Paco和cbp的评论中所述)。一个地方是在你的行动方法中处理它。检查结果并通过错误页面向用户报告。