먼저 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 코드와 트랜잭션 지원을받을 수있는 간단한 방법이 있나요?
감사합니다.
나는 동의한다. 'SaveChanges'는 연결 자체를 열고 닫습니다. 나는 단지 더 나은 대답이되기를 바랐다. 구조 조정은 가능하지만 코드가 중복 될 수있다. 장바구니를 삭제하는 DeleteCart 메서드가 있습니다. 이것은 내 서비스의 소비자가 직접 호출 할 수 있지만 다른 시간에는 내부적으로 호출 할 수도 있습니다 (카트를 삭제할 수있는 여러 가지 방법이 있습니다). –
중복 된 코드를 의미하지는 않습니다. 예를 들어, 웹 애플리케이션을 구축하는 경우, 요청 시작시 dbcontext를 열고, 요청이 끝날 때'SaveChanges()'를 여는 패턴이 있습니다. 따라서 요청 내에서 발생하는 모든 작업이 커밋됩니다. 이것은 더 진실한 끈기의 무지 향하여 기울고 있습니다. –
이것은 좋은 참조 질문입니다. http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why –