Cómo deshacer una transacción en el marco de la entidad
-
21-08-2019 - |
Pregunta
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 de forma automática, lo que significa que si se produce un error, los cambios que cometen se cancelan todos los cambios. es?
Solución
Aceptar
He creado una muestra de una aplicación como el ejemplo de la la pregunta y epílogos que he marcado en el PP y no se añadieron los usuarios.
Conclusión: ObjectContext.SaveChange es automáticamente una transacción
.Nota:. Creo que serán necesarios si la ejecución de transacciones sprocs etc.
Otros consejos
Creo (pero no soy un experto en mucho tiempo EF) que hasta la llamada a context.SaveChanges pasa a través, no se inicia la transacción. Yo esperaría una excepción a esa llamada sería deshacer automáticamente cualquier transacción que comenzó. Alternativas (en caso de que quiera tener el control de la transacción) [ "Programación de Entity Framework" de J.Lerman 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();
}
}
}