質問

Nhibernateメソッドフラッシュにスローされる例外を処理するにはどうすればよいですか?オブジェクトを削除するためのアクションがあります。投稿されたIDと呼び出しを使用してリポジトリからオブジェクトをロードします repository.Delete(obj).

Nhibernateでの私のマッピングは完全ではなく、削除が「削除ステートメントが参照制約と矛盾する」という例外を削除することを除いて、これはこのケースの例外ハドリングを実装するのに良いケースです。

そのため、例外はフラッシュにスローされ、フラッシュはunitofworkperRequestTaskで呼び出されます。Rhino.Commons.UnitOfWork)。このタスクは、ウィンザーコンテナを使用して登録されています 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

手伝ってくれてありがとう。

役に立ちましたか?

解決

unitofworkでflush()を呼び出すと、エラーのみをキャッチしてログに記録できます。

ユーザーがエラーについて通知したい場合は、トランザクションを閉じたり、Flushを早めに実行したりします(PACOとCBPのコメントで述べたように)。 1つの場所は、アクション方法でそれを処理することです。結果を確認し、エラーページでユーザーに報告してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top