2009-07-01 16 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. 
    } 

O forse questo viene fatto automaticamente, nel senso che se si verifica un errore, le modifiche di commit vengono annullate per tutte le modifiche. è?Come eseguire il rollback di una transazione in Entity Framework

risposta

12

OK

ho creato un campione sono stati aggiunti un'applicazione come l'esempio dalla domanda e afterwords Ho controllato nel DB e nessun utente.

Conclusione: ObjectContext.SaveChange è automaticamente una transazione.

Nota: Credo che saranno necessari transazioni se sprocs esecuzione ecc

+0

sì, questo è corretto –

8

Credo (ma non sono esperto da molto tempo in EF) che fino a quando non viene eseguita la chiamata al contesto.SaveChanges, la transazione non viene avviata. Mi aspetterei che un'eccezione da quella chiamata ripristini automaticamente tutte le transazioni avviate. Alternative (nel caso in cui si desideri avere il controllo della transazione) [da J.Lerman's "Programming Entity Framework" O'Reilly, pag. 618]

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

o

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

"Io credo" che cosa? – Shimmy

+0

In sostanza, credo che si ottenga il rollback della transazione gratuitamente nello scenario semplice e che sarà necessario gestire le transazioni come dimostrato nei due esempi per scenari più complessi. La tua app di esempio sembra confermarlo. Scusa se la mia formulazione fosse meno che stellare - era tra una riunione e l'altra quando ho scritto questo ieri. – FOR

Problemi correlati