Ich habe eine Entität, die eine Viele-zu-Viele-Beziehung hat. Als Beispiel betrachten Sie diese Entität:
%Vor%So konfiguriere ich das Mapping:
%Vor% Da diese Beziehung nun vom EF verwaltet wird, habe ich nicht wirklich Zugriff auf den UserFriends
DbSet
in meinem Code und kann den gleichzeitigen Zugriff darauf nicht verarbeiten.
Damit diese Komposition den gleichzeitigen Zugriff (Hinzufügen / Entfernen) verarbeiten kann, muss ich die Viele-zu-Viele-Beziehung selbst behandeln und dann eine [Timestamp]
-Spalte hinzufügen oder gibt es eine Möglichkeit, EF anzuweisen, dies gleichzeitig selbst zu behandeln? Wie eine Konfiguration im Model Builder.
Bearbeiten: Ich benutze EF 6 und wenn es momentan eine gleichzeitige Operation für die Entität gibt (zB versucht, einen Freund zu entfernen, der gerade nicht auf der Datenbank beendet wird) erhalte ich die folgende Fehlermeldung und ein DbUpdateException
:
Beim Speichern von Entitäten, die keinen Fremdschlüssel enthalten, ist ein Fehler aufgetreten Eigenschaften für ihre Beziehungen. Die Eigenschaft EntityEntries wird Gibt null zurück, da eine einzelne Entität nicht als Quelle identifiziert werden kann der Ausnahme. Behandlung von Ausnahmen beim Speichern kann vorgenommen werden einfacher, indem Sie die Fremdschlüsseleigenschaften in Ihren Entitätstypen angeben. Sehen die InnerException für Details.
Optimistischer Nebenläufigkeit gilt hier nicht.
Eine Junction-Tabelle wird nie aktualisiert. Seine Datensätze werden entweder hinzugefügt oder gelöscht. Dies bedeutet, dass es keine CRUD-Operationen gibt, die eine Zeilenversion benötigen.
In der Tat ist Nebenläufigkeit ziemlich einfach:
Es geht also darum, Ausnahmen zu behandeln und sie in verständliches Benutzerfeedback zu übersetzen. All diese Situationen müssen auch in Situationen behandelt werden, in denen Aktualisierungen (und optimistische Nebenläufigkeit) eine Rolle spielen.
Obwohl in der UserFriends-Tabelle keine Zeileversionsspalte vorhanden ist, kann EF immer noch erkennen, dass die Ursache für DbContext.SaveChanges-Fehler ein Gleichzeitigkeitsproblem im Fall einer Viele-zu-Viele-Beziehung ist. In diesem Fall gibt die ef die Exception OptimisticConcurrencyException mit DbUpdateException opaqued aus. Verwenden Sie den folgenden Code, um es abzufangen:
%Vor%Sie können die aktuell fließende API nicht so konfigurieren, dass sie automatisch in die UserFriends-Tabellenzeilenspalten eingefügt wird. Sie können jedoch nach der Migration manuell zur CreateTable-Anweisung von createTable der Zeilenspaltenzeile hinzufügen:
%Vor%Dies ändert jedoch nicht das DbContext-Verhalten, wenn ein Gleichzeitigkeitsproblem in einer Viele-zu-Viele-Beziehung auftritt.
Tags und Links c# entity-framework optimistic-concurrency