Die Verwendung von SaveChanges() im Entity Framework ist sehr häufig, und das Aufrufen von SaveChanges() nach einer einzigen Änderung oder Löschung von Daten gibt die Anzahl der Impact-Datensätze zurück.
Um Batch-Modifikation oder Batch-Löschung von Daten zu verwenden, benötigt man die Methode SaveChanges(false)+AcceptAllChanges().
SaveChanges(false) ist einfach eine Benachrichtigung, dass EF eine Operation an der Datenbank ausführen muss, die im Speicher aussteht und bei Bedarf rückgängig gemacht werden kann, zum Beispiel ist das Committing von AcceptAllChange() wirklich erfolgreich und EF rückgängig macht die Aktion von SaveChanges(false) rückgängig.
Bei verteilten Transaktionsoperationen ist es notwendig, TransactionScope zu verwenden, um sie zu handhaben, und oft schreiben wir so:
Aber so zu schreiben ist riskant, falsch Zum Beispiel: Kontext1. SaveChanges() war erfolgreich, context2. SaveChanges() ist problematisch, wir sind im Scope. Complete() endet, wenn die Transaktion committet ist und Context1 erfolgreich ausgeführt wurde
(In meiner Praxis kann das oben Beschriebene tatsächlich normal zurückgesetzt werden, wenn Kontext 1 ist. SaveChanges() war erfolgreich, context2. SaveChanges() ist problematisch, keines von beiden wird erfolgreich ausgeführt! Beziehen Sie sich auf den System.Transaction-Namensraum in Ihrem Projekt. Die Definition eines Transaktionsumfangs in der Nutzung entspricht der Definition eines Umfangs von Dingen, d. h. der Umfang dieser Transaktion liegt innerhalb von Nutzungsbereich. Im Nutzungsumfang, wenn es keinen Umfang gibt. Complete()-Befehl, dann rollt der Umfang automatisch alle Operationen zurück, wenn sie zerstört werden. ) Das entspricht nicht unbedingt unseren Bedürfnissen. Wenn wir möchten, dass Kontext1 und Kontext2 gleichzeitig erfolgreich ausgeführt werden oder keiner gelingt, müssen wir kleine Anpassungen am Code vornehmen, wie zum Beispiel den folgenden Code:
Wir verwenden SaveChanges(false), um zuerst die notwendigen Datenbankoperationsbefehle an die Datenbank zu senden, was bedeutet, dass sich Kontext1 und Kontext2 eigentlich nicht geändert haben; wenn die Transaktion beendet und automatisch zurückgesetzt wird, wird keine der Änderungen tatsächlich in die Datenbank festgelegt, sodass sie erfolgreich zurückgerollt werden kann.
|