如何处理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
感谢您的帮助。
答案 0 :(得分:1)
如果在UnitOfWork中调用Flush(),则只能捕获错误并将其记录下来。
如果您希望用户通知错误,请关闭交易或执行Flush earlierer(如Paco和cbp的评论中所述)。一个地方是在你的行动方法中处理它。检查结果并通过错误页面向用户报告。