Wie eine Transaktion in Entity Framework Rollback
-
21-08-2019 - |
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?
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();
}
}
}