Parallelität in ADO.NET Entity Framework
-
10-07-2019 - |
Frage
Ich fand ein MSDN-Artikel das beschreibt, wie EF Parallelität behandelt, wenn die Änderungen zu speichern:
In der Standardeinstellung [...] Object Service spart Objekt Änderungen an der Datenbank ohne Überprüfung auf Gleichzeitigkeit . Zum Eigenschaften, die ein auftreten können hohen Grad an Parallelität, wir empfehlen, dass die Entitätseigenschaft sein in dem Konzeptionslayer definiert sind, mit ein Attribut ConcurrencyMode = "fixed"
Ich habe zwei Fragen:
-
Da sie keine Eigenschaften in meinem Modell, wo
ConcurrencyMode="fixed"
, ist es sicher für mich anzunehmen, dass, wenn überhaupt eineOptimisticConcurrencyException
ausgelöst wird, wenn die Änderungen zu speichern, ist es, weil das Unternehmen nicht mehr in den Datenspeicher vorhanden ist, dh es wurde von einem anderen Benutzer gelöscht, oder bin ich etwas fehlt?Ich stelle mir vor EF Ausführen einer
UPDATE
-Anweisung, die etwa wie folgt aussieht, die, wie ich es sehe, wird nur einOptimisticConcurrencyException
dazu führen, ausgelöst zu werden, wenn die Person mit ID = 1 existiert nicht:UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
-
Wenn
ConcurrencyMode="fixed"
verwenden, wird EF-Check für Concurrency wenn Entitäten als auch zu löschen? Mit anderen Worten, wird ausgeführt, EF jemals eineDELETE
-Anweisung, die wie folgt aussieht (mit mehr als nur die Primärschlüssel in derWHERE
-Klausel):DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
Lösung
Gute Frage.
(1) Ja, aber leider ist es nicht ganz so einfach. Da die EF (3.5) ein unabhängiges Assoziationsmodell aufweist, wird der Verband unabhängig zu behandeln, und obwohl Sie haben nicht gesagt, so ist es einen Teil der Gleichzeitigkeit Prüfungen während Aktualisierungen und Löschungen wird.
d. wenn Sie eine Person aktualisieren, werden Sie oft Updates sehen, die wie folgt aussehen:
UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith'
WHERE ID = 1 AND Partner = 2
d. Partner ist eine FK-Spalte.
Dies alles ändert in 4.0, wenn Sie FK Verbände verwenden, da wir die meisten Menschen zu erwarten.
(2) Für jeden ConcurrencyMode DELETE = 'fixed' Eigenschaften werden bei der Lösch geprüft. Die Ausnahme ist, wenn Sie einen SPROC zum Löschen haben, das nicht, dass Concurrency Werte akzeptiert.
Hope, das hilft
Alex