2012-11-27 2 views
1

먼저 EF5 코드를 사용하고 동일한 트랜잭션에서 복수 통화를 SaveChanges()으로 랩핑해야합니다. 나는 상대적으로 transactionScope를 사용하는 것에 익숙하지 않고, 내가하고 싶은 것을 성취하기 위해 옵션을 조정할 수 없다.EF5 코드 MSDTC로 에스컬레이션하지 않고 첫 번째 TransactionScope

다음 코드는 내 DbContext 클래스의 인스턴스로 주입되는 서비스 클래스에 있습니다. 이 클래스의 아무 곳에 나 DbContext의 추가 인스턴스를 만들지 않습니다.

처음에는 다음을 시도했습니다. 코드는 훌륭하고 깨끗하지만 GenerateInvoice 함수의 SaveChanges 메서드 중 DTC로 에스컬레이션을 시도합니다.

using (var scope = new TransactionScope()) 
{ 
    // This function does some work and calls SaveChanges 
    Guid invoiceId = GenerateInvoice(cart); 

    // This function also does some querying and calls SaveChanges 
    DeleteCart(); 

    // Transaction should only commit if both functions above were successful 
    scope.Complete(); 

} 

는 제가 조사를 좀 해봤 DTC에게 이관하지 않습니다 다음에 코드를 변경,하지만 난 그게 최선의 방법인지 확실하지 않다.

IObjectContextAdapter adapter = (IObjectContextAdapter)_context; 

adapter.ObjectContext.Connection.Open(); 

using (var scope = new TransactionScope()) 
{ 

    // This function does some work and calls SaveChanges 
    Guid invoiceId = GenerateInvoice(cart); 

    // This function also does some querying and calls SaveChanges 
    DeleteCart(); 

    // Transaction should only commit if both functions above were successful 
    scope.Complete(); 

    adapter.ObjectContext.Connection.Close(); 

} 

DTC를 확대하지 않고 먼저 여러 SaveChanges에서 EF5 코드와 트랜잭션 지원을받을 수있는 간단한 방법이 있나요?

감사합니다.

답변

2

아니요. 그리고 그것은 또한 의미가 있습니다. SaveChanges() 번을 두 번 이상 호출하면 잠재적으로 데이터베이스에 대한 다중 연결이 열리게됩니다. 이러한 연결을 통해 트랜잭션을 조정하는 유일한 방법은 분산 트랜잭션 (따라서 MSDTC)입니다.

내가 얻을 수있는 최선의 해결책은 SaveChanges() 한 번만 호출하는 것이 었습니다. 이는 일부 코드를 재구성하는 것을 의미 할 수 있지만, 트랜잭션이 필요한 모든 엔티티가 모두 동시에 커밋하는 것이 가장 좋습니다.

한번만 SaveChanges()을 호출하면 EF 변경 추적기가 캐시를 사용하고 앱과 db 간의 많은 통신을 저장할 수 있습니다.

+0

나는 동의한다. 'SaveChanges'는 연결 자체를 열고 닫습니다. 나는 단지 더 나은 대답이되기를 바랐다. 구조 조정은 가능하지만 코드가 중복 될 수있다. 장바구니를 삭제하는 DeleteCart 메서드가 있습니다. 이것은 내 서비스의 소비자가 직접 호출 할 수 있지만 다른 시간에는 내부적으로 호출 할 수도 있습니다 (카트를 삭제할 수있는 여러 가지 방법이 있습니다). –

+0

중복 된 코드를 의미하지는 않습니다. 예를 들어, 웹 애플리케이션을 구축하는 경우, 요청 시작시 dbcontext를 열고, 요청이 끝날 때'SaveChanges()'를 여는 패턴이 있습니다. 따라서 요청 내에서 발생하는 모든 작업이 커밋됩니다. 이것은 더 진실한 끈기의 무지 향하여 기울고 있습니다. –

+0

이것은 좋은 참조 질문입니다. http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why –

관련 문제