Frage

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.
    }

Vielleicht geschieht dies automatisch, was bedeutet, dass, wenn Fehler auftreten, begehen die Änderungen für alle Änderungen rückgängig. ist es?

War es hilfreich?

Lösung

OK

Ich habe eine Probe eine Anwendung wie das Beispiel aus der der Frage und anschliessend ich in der DB überprüft und keine Benutzer hinzugefügt.

Fazit: ObjectContext.SaveChange es automatisch eine Transaktion

.

. Hinweis: Ich glaube, dass Transaktionen benötigt werden, wenn sprocs Ausführung etc

Andere Tipps

Ich glaube, (aber ich bin nicht lange Experte in EF), dass, bis der Anruf zu context.SaveChanges durchgeht, wird die Transaktion nicht gestartet. Ich würde erwarten, dass eine Ausnahme von diesem Anruf automatisch jede Transaktion Rollback wäre es gestartet. Alternativ (im Fall, dass Sie die Kontrolle über die Transaktion sein) [von J.Lerman der „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();
  }
}

oder

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top