Mit dem Entity Framework ist die meiste Zeit SaveChanges()
ausreichend. Dadurch wird eine Transaktion erstellt oder eine Umgebungstransaktion eingetragen, und alle erforderlichen Arbeiten für diese Transaktion werden ausgeführt.
Manchmal ist die SaveChanges(false) + AcceptAllChanges()
Paarung jedoch nützlich.
Der nützlichste Ort hierfür ist in Situationen, in denen Sie eine verteilte Transaktion über zwei verschiedene Kontexte ausführen möchten.
Dh so etwas (schlecht):
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save and discard changes
context1.SaveChanges();
//Save and discard changes
context2.SaveChanges();
//if we get here things are looking good.
scope.Complete();
}
Wenn dies context1.SaveChanges()
erfolgreich ist, aber context2.SaveChanges()
fehlschlägt, wird die gesamte verteilte Transaktion abgebrochen. Leider hat das Entity Framework die Änderungen bereits verworfen context1
, sodass Sie den Fehler nicht wiederholen oder effektiv protokollieren können.
Aber wenn Sie Ihren Code so ändern, dass er so aussieht:
using (TransactionScope scope = new TransactionScope())
{
//Do something with context1
//Do something with context2
//Save Changes but don't discard yet
context1.SaveChanges(false);
//Save Changes but don't discard yet
context2.SaveChanges(false);
//if we get here things are looking good.
scope.Complete();
context1.AcceptAllChanges();
context2.AcceptAllChanges();
}
Während der Aufruf zum SaveChanges(false)
Senden der erforderlichen Befehle an die Datenbank wird der Kontext selbst nicht geändert, sodass Sie ihn bei Bedarf erneut ausführen oder bei Bedarf abfragen können ObjectStateManager
.
Dies bedeutet, wenn die Transaktion tatsächlich eine Ausnahme auslöst, können Sie diese kompensieren, indem Sie den Status jedes Kontexts entweder erneut versuchen oder protokollieren ObjectStateManager
.
Weitere Informationen finden Sie in meinem Blogbeitrag .
SaveChanges(fase); ... AcceptAllChanges();
es überhaupt ein Muster gab. Beachten Sie, wie die akzeptierte Antwort auf die obige Frage vom Autor eines Blogs geschrieben wird - und auf dieses Blog wird in der anderen Frage verwiesen. Es kommt alles zusammen.