So machen Sie eine Transaktion in Entity Framework rückgängig

c# entity-framework rollback savechanges transactions

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

Oder dies erfolgt automatisch, dh wenn ein Fehler auftritt, werden festgeschriebene Änderungen für alle Änderungen abgebrochen. ist es?

Akzeptierte Antwort

OK

Ich erstellte ein Beispiel einer Anwendung wie das Beispiel aus der Frage und den Nachworten, die ich in der Datenbank eingecheckt hatte, und es wurden keine Benutzer hinzugefügt.

Fazit: ObjectContext.SaveChange ist automatisch eine Transaktion.

Anmerkung: Ich glaube, dass Transaktionen erforderlich sind, wenn Sprocs usw. ausgeführt werden.


Beliebte Antwort

Ich glaube (aber ich bin kein langjähriger Experte für EF), dass die Transaktion erst gestartet wird, wenn der Aufruf von context.SaveChanges durchläuft. Ich würde erwarten, dass eine Ausnahme von diesem Aufruf jede Transaktion automatisch rückgängig machen würde. Alternativen (für den Fall, dass Sie die Transaktion steuern möchten) [aus J.Lermans "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 with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum