2010-08-16 6 views
0

NHibernate 메서드에서 throw되는 예외를 어떻게 처리 할 수 ​​있습니까? 개체를 삭제하는 작업이 있습니다. 게시 된 ID를 사용하여 저장소에서 객체를로드하고 repository.Delete(obj)로 호출합니다.플러시 단계에서 예외를 처리하는 방법?

NHibernate에서의 매핑이 완전하지 않고 삭제 결과가 "DELETE 문이 REFERENCE 제약 조건과 충돌합니다"라는 예외가 발생하는 경우를 제외하고는이 경우에 대한 예외 사항을 구현하는 것이 좋습니다.

따라서 플러시에서 예외가 발생하고 모든 요청에서 생성되고 삭제 된 UnitOfWorkPerRequestTask에서 플러시가 호출되고 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

나는 그것을 처리하지 않을 것이다, 나는 그것이 던져 질 것이라고 막을 것이다. – Paco

+0

사용자에게 DELETE가 실패했다는 사실을 사용자에게 알리는 UI/비즈니스 계층 우려가 있습니다. 사용자가 그것을 잡으려면 UI 레이어에 더 가깝게 잡으십시오. 하지만 파코 (Paco)가 말했듯이, 나는 아마 그것을 잡지 않을 것이다. 사용자가 첨부 된 관계로 사물을 삭제하려고 시도하는 것을 방지해야한다. – cbp

+0

if (CanBeDeleted) {Delete(); } else {tellUserThatItCannotBeDeleted(); } – Paco

답변

1

UnitOfWork에서 Flush()를 호출하면 오류를 catch하고 기록 할 수 있습니다.

사용자가 오류에 대해 알리려면 거래를 닫거나 초기화 방법 (Paco 및 cbp의 설명 참조)을 수행하십시오. 한 가지 방법은 당신의 행동 방식에서 그것을 다루는 것입니다. 결과를 확인하고 오류 페이지와 함께 사용자에게보고하십시오.

관련 문제