2009-07-01 24 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 tal vez esto se hace automáticamente, lo que significa que si se produce un error, se cancelan los cambios para confirmar todos los cambios. ¿verdad?Cómo revertir una transacción en Entity Framework

Respuesta

12

OK

creé una muestra se añadieron una aplicación como el ejemplo de la la pregunta y epílogos que he marcado en el PP y no usuarios.

Conclusión: ObjectContext.SaveChange es automáticamente una transacción.

Nota: Creo que serán necesarios si las transacciones sprocs ejecución etc.

+0

sí, esto es correcto –

8

Creo (pero no soy un experto en EF desde hace mucho tiempo) que hasta la llamada a context.SaveChanges se realiza, la transacción no se inicia. Esperaría que una Excepción de esa llamada revertiría automáticamente cualquier transacción que iniciara. Alternativas (en caso de que quiera tener el control de la transacción) [de J.Lerman's "Programming Entity Framework" O'Reilly, pg. 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

"creo" que lo que? – Shimmy

+0

En esencia, creo que puede deshacerse de las transacciones de forma gratuita en el escenario simple, y que tendrá que manejar las transacciones como se demuestra en los dos ejemplos para escenarios más complejos. Tu aplicación de muestra parece confirmar esto. Disculpe si mi redacción fue menos que estelar: hubo reuniones intermedias cuando escribí esto ayer. – FOR

Cuestiones relacionadas