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?

¿Fue útil?

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();
    }
  }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top