Parallelitätsausnahmen in Entity Framework
-
21-12-2019 - |
Frage
Beim Anrufen SaveChanges
/ SaveChangesAsync
Wenn in Entity Framework (CF, C#) ein Änderungskonflikt auftritt (z. B. wurden die Werte seit dem letzten Lesevorgang aktualisiert), welche dieser beiden Ausnahmen gibt es? DbUpdateConcurrencyException
ODER OptimisticConcurrencyException
soll ich fangen?
Und was ist der Unterschied zwischen ihnen?
Lösung
DbUpdateConcurrencyException
ist eine bestimmte Ausnahme, die von ausgelöst wird DbContext
, also ist dies derjenige, den es zu fangen gilt.Diese Ausnahme kann durch einen Basiswert verursacht werden OptimisticConcurrencyException
, aber wenn ja, wird diese Ausnahme als innere Ausnahme verpackt.
Da nicht alle Aktualisierungsausnahmen durch Parallelität verursacht werden, müssen Sie sie auch abfangen DbUpdateException
nach fangen DbUpdateConcurrencyException
(weil Letzteres ein Untertyp von ist DbUpdateException
).
Siehe auch Behandelt Entity Framework 5.0 eine optimistische Parallelitätsausnahme?.
Andere Tipps
Sie erhalten eine OptimisticConcurrencyException
.Schauen Sie mal vorbei Das.
Kommen wir nun zum Unterschied.
- OptimisticConcurrencyException:Wird ausgelöst, wenn eine Verletzung der optimistischen Parallelität auftritt (angenommen, mehr als eine Person wechselt zum gleichen Ergebnis, und dies führt zu dem Problem, dass sie nicht synchronisiert werden).
- DbUpdateConcurrencyException:Von DbContext ausgelöste Ausnahme, wenn das erwartete Verhalten darin besteht, dass SaveChanges für eine Entität zu einer Datenbankaktualisierung führen würde, tatsächlich aber keine Zeilen in der Datenbank betroffen waren.Dies zeigt, dass die Datenbank gleichzeitig aktualisiert wurde und ein Parallelitätstoken, dessen Übereinstimmung erwartet wurde, tatsächlich nicht übereinstimmte.Statuseinträge, auf die sich diese Ausnahme bezieht, werden aus Sicherheitsgründen nicht serialisiert und der Zugriff auf die Statuseinträge nach der Serialisierung gibt Null zurück.