2009-07-01 19 views
9
string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" }; 
using (Entities context = new Entities()) 
{ 
    foreach (string user in usersToAdd) 
    { 
     context.AddToUsers(new User { Name = user }); 
    } 
    try 
    { 
     context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist. 
    } 
    catch (Exception e) 
    { 
     //Roll back all changes including the two previous users. 
    } 

A może dzieje się to automatycznie, co oznacza, że ​​jeśli wystąpi błąd, zatwierdzenie zmian zostanie anulowane w przypadku wszystkich zmian. jest to?Jak wycofać transakcję z Entity Framework

Odpowiedz

12

OK

stworzyłem próbkę aplikacja jak w przykładzie z pytaniem i posłowia Sprawdziłem w DB i nie dodano użytkowników.

Wniosek: ObjectContext.SaveChange to automatycznie transakcja.

Uwaga: wierzę będą potrzebne, jeśli transakcje realizujące sprocs itp

+0

tak, to jest poprawne –

8

Wierzę (ale nie jestem ekspertem od EF), że dopóki nie nastąpi wywołanie context.SaveChanges, transakcja nie zostanie rozpoczęta. Spodziewam się, że wyjątek z tego połączenia automatycznie wycofa każdą rozpoczętą transakcję. Alternatywy (w przypadku, gdy chcesz kontrolować transakcję) [z J.Lerman's "Programming Entity Framework" O'Reilly, str. 618]

using (var transaction = new System.Transactions.TransactionScope()) 
{ 
    try 
    { 
    context.SaveChanges(); 
    transaction.Complete(); 
    context.AcceptAllChanges(); 
    } 
    catch(OptimisticConcurrencyException e) 
    { 
    //Handle the exception 
    context.SaveChanges(); 
    } 
} 

lub

bool saved = false; 
using (var transaction = new System.Transactions.TransactionScope()) 
{ 
    try 
    { 
    context.SaveChanges(); 
    saved = true; 
    } 
    catch(OptimisticConcurrencyException e) 
    { 
    //Handle the exception 
    context.SaveChanges(); 
    } 
    finally 
    { 
    if(saved) 
    { 
     transaction.Complete(); 
     context.AcceptAllChanges(); 
    } 
    } 

} 
+0

„Wierzę”, że co? – Shimmy

+0

Zasadniczo uważam, że w prostym scenariuszu można uzyskać wycofanie transakcji za darmo i że będziesz musiał obsługiwać transakcje, jak pokazano w dwóch przykładach w przypadku bardziej złożonych scenariuszy. Twoja przykładowa aplikacja zdaje się to potwierdzać. Przepraszam, jeśli moje sformułowanie było mniej niż gwiezdne - było pomiędzy spotkaniami, kiedy pisałem to wczoraj. – FOR