2014-12-03 4 views

답변

1

DevForce는 유효성 검사 및 저장 프로세스에 동일한 트랜잭션을 사용하지 않습니다. EntityServerSaveInterceptor 컨텍스트 내에서 권한 부여 및 유효성 검사가 수행 된 다음 실제 저장을 수행 할 때 TransactionScope가 열립니다. 검증 자 내에서 쿼리를 수행하면 별도의 TransactionScope가 사용됩니다.

사용자 지정 EntityServerSaveInterceptor에서 약간의 추가 작업을 수행하면이 문제를 해결할 수 있습니다. ValidateSave 함수를 재정 의하여 유효성 검사를 무시한 다음 ExecuteSave 메서드를 재정 의하여 TransactionScope를 연 다음 기본 저장 논리를 호출하기 전에 유효성 검사 논리를 수행합니다. 저장 중에 DF에 의해 열리는 TransactionScope는 TransactionScope에 등록됩니다. 이런 식으로 뭔가 :

public class EntityServerSaveManager : EntityServerSaveInterceptor { 

    protected override bool ValidateSave() { 
    // will do validation later 
    return true; 
    } 

    protected override bool ExecuteSave() { 
    using (var ts = new TransactionScope(TransactionScopeOption.Required, this.SaveOptions.TransactionSettings.ToTransactionOptions())) { 
     // Do validation logic now 
     ... 

     // Now do save 
     base.ExecuteSave(); 
     ts.Complete(); 
    } 
    } 
} 
+0

그래서 '지금 유효성 검사 논리를 수행합니다'의 일환으로, 내 사용자 지정 유효성 검사를 수행 한 후, 나는 base.ValidateSave를 부를 것이다()? UniqueVerifier를 작성하면 'Validation logic now'가 base.ValidateSave()에 대한 호출일까요? – jbiddle

+0

인스턴스 검증자는 base.ValidateSave에 의해 자동으로 호출되므로 TransactionScope 내에서 base.ValidateSave를 호출하면됩니다. –

+0

이것을 시도하면 다음 예외가 발생합니다. TransactionScope에 지정된 트랜잭션이 범위에 대해 요청 된 값과 다른 IsolationLevel을가집니다. 클라이언트와 서버 모두에서 모든 엔티티 관리자에 대해 DefaultSaveOptions를 설정하는 방법. 그게 중요하다면 나는 칵테일을 사용하고있다. – jbiddle