【问题标题】:How to handle exception in Flush phase?如何处理 Flush 阶段的异常?
【发布时间】:2010-08-16 07:11:51
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 我不会处理它,我会阻止它被抛出。
  • 通知您的用户删除失败对我来说似乎是 UI/业务层的问题 - 如果您想抓住它,我会在更靠近您的 UI 层的地方抓住它。但就像 Paco 说的那样,我可能不会明白 - 您应该阻止您的用户尝试删除具有附加关系的内容。
  • if (CanBeDeleted) { Delete(); } else { tellUserThatItCannotBeDeleted(); }
  • 我写道,映射不完整(它不是生产版本),但是如果抛出另一个异常呢?例如,当超时到期等删除只是一个例子。但是感谢您的 cmets。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多