Entity Framework Many-to-Many-Self-Relationship- und Optimistic-Concurrency-Control

8

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.

    
Farhad Alizadeh Noori 22.04.2015, 16:11
quelle

2 Antworten

3

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:

  • Zwei gleichzeitige Benutzer können nicht die gleiche Zuordnung hinzufügen, da die letzte auf eine eindeutige Schlüsselverletzung stößt.
  • Zwei gleichzeitige Benutzer können dieselbe Zuordnung nicht löschen, da die letzte eine Ausnahme enthält, bei der eine unerwartete Anzahl von Datensätzen (0) betroffen war.
  • Wie bei Fremdschlüsselproblemen (Hinzufügen / Entfernen einer Zuordnung zu einer Entität, die zwischenzeitlich gelöscht wurde). Diese werden auch Ausnahmen auslösen.

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.

    
Gert Arnold 22.04.2015 21:54
quelle
1

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.

    
mr100 22.04.2015 21:32
quelle