2012-10-17 2 views
4

서로 다른 비즈니스 모듈 용으로 생성 된 테이블이있는 상당히 큰 데이터베이스가 있습니다.EF4에서 여러 ObjectContexts에 대해 단일 SQL 트랜잭션을 구현하는 방법

우리는 서로 다른 모듈에 대해 서로 다른 edmx 파일을 생성하기로 결정했습니다.

그러나 다른 edmx의 여러 테이블에 쓰는 논리적 작업에 대해 TransactionScope를 구현할 때 MSDTC 사용을 방지하려면 어떻게해야합니까? 다시 말하지만, 기본 데이터베이스는 동일합니다.이 시나리오에서는 MSDTC를 사용하고 싶지 않습니다.

활성 트랜잭션으로 열린 SQL 연결을 전달할 수있는 방법이 있습니까?

미리 도움을 주셔서 감사합니다. 데이터베이스가 다른 및/또는 연결 문자열이 다른 경우

안부, 윌리엄

+0

EF에서 반드시 * everything * 할 필요는 없습니다. –

답변

2

TransactionScope는 MSDTC를 입대한다.

릭 스트 렐은 이것에 great article을 가지고 있습니다 (그의 관점은 LINQ to SQL이지만 EF에는 적용 가능합니다). 돈 단락 :

TransactionScope에 그것을 만드는 높은 수준의 트랜잭션 래퍼입니다 수동 거래를 추적 할 필요없이 트랜잭션에 코드를 포장하기 정말 쉬운. 전통적으로 TransactionScope는 DTC (Distributed Transaction Coordinator) 주변의 .NET 래퍼 였지만 기능이 다소 확장되어 입니다. 한 가지 우려 사항은 DTC가 리소스 사용량면에서 다소 높은 이며 실제로 DTC 서비스가 DTC 서비스가 실제로 컴퓨터에서 실행 중이어야합니다 (클라이언트 설치에서 특히 번거로운 또 다른 서비스 ).

그러나 TransactionScope에와 SQL Server 클라이언트 드라이버에 대한 최신 업데이트가 가능하여 TransactionScope 클래스를 사용하고 의 용이성은 당신이 하나의 데이터베이스에 대해 단일로 를 실행하는만큼 DTC없이 제공 사용 일관된 연결 문자열. 위의 예제에서는 트랜잭션이 DataContext의 단일 인스턴스로 작동하기 때문에 트랜잭션은 실제로 DTC를 사용하지 않고 으로 작동합니다. 이것은 SQL Server 2008에 있습니다.

또한 SO question/answer을 참조하십시오. 여기에서 Rick의 블로그 링크를 발견했습니다.

동일한 데이터베이스에 연결하고 동일한 연결 문자열을 사용하는 경우 DTC가 관련되어서는 안됩니다.

0

위의 모든 답장을 보내 주셔서 감사합니다! 그런데 EntityConnection과 EntityTransaction을 명시 적으로 사용하는 솔루션을 찾기 위해 관리했습니다. 샘플은 다음과 같이이다 : EntityConnection을 & EntityTransaction의 명시 적 사용과

string theSqlConnStr = "data source=TheSource;initial catalog=TheCatalog;persist security info=True;user id=TheUserId;password=ThePassword"; 

    EntityConnectionStringBuilder theEntyConnectionBuilder = new EntityConnectionStringBuilder(); 
    theEntyConnectionBuilder.Provider = "System.Data.SqlClient"; 
    theEntyConnectionBuilder.ProviderConnectionString = theConnectionString; 
    theEntyConnectionBuilder.Metadata = @"res://*/"; 

    using (EntityConnection theConnection = new EntityConnection(theEntyConnectionBuilder.ToString())) 
    { 
     theConnection.Open(); 
     theET = null; 

     try 
     { 
      theET = theConnection.BeginTransaction(); 

      DataEntities1 DE1 = new DataEntities1(theConnection); 
      //DE1 do somethings... 

      DataEntities2 DE2 = new DataEntities2(theConnection); 
      //DE2 do somethings... 

      DataEntities3 DE3 = new DataEntities3(theConnection); 
      //DE3 do somethings... 

      theET.Commit(); 
     } 
     catch (Exception ex) 
     { 
      if (theET != null) { theET.Rollback(); } 
     } 
     finally 
     { 
      theConnection.Close(); 
     } 
    } 

, 나는 MSDTC의 사용을 부과 할 필요없이 아직 하나의 데이터베이스에 대한 여러 ObjectContexts에 대한 단일 연결 및 트랜잭션의 공유를 달성 할 수있다.

희망 정보는 도움이됩니다. Gd 운!

관련 문제