Verletzung der PRIMARY KEY-Einschränkung in Entity Framework code first-link-Tabelle
Ich habe eine Tabelle User und eine Rollen-Tabelle. Dort ist eine automatisch generierte UsersRoles link-Tabelle enthält die Id aus der User-und Rollen-Tabellen. Dieser generiert mit dem folgenden code:
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany(r => r.Users)
.Map(c => {
c.MapLeftKey("UserId");
c.MapRightKey("RoleId");
c.ToTable("UsersRoles");
});
Wenn ich versuche, fügen Sie eine unabhängige Person, und rufen Sie Context.SaveChanges()
ich die folgende Fehlermeldung:
Verletzung der PRIMARY KEY-Einschränkung 'PK_UsersRoles'. Kann nicht einfügen
doppelten Schlüssel im Objekt 'dbo.UsersRoles'. Der doppelte Schlüsselwert ist
(2beaf837-9034-4376-9510-b1609c54efbe,
dcd16d00-d46e-4d48-8328-3e7b35b11ccf). Die Anweisung wurde
beendet.
Ich habe die Conext.ChangeTracker.Entries()
für die Elemente, die in der Fehlermeldung genannten und die Entity-Zustand markiert ist, als Unverändert.
Die einzige Person, der markiert ist als die neue Platte, die ich bin versucht hinzuzufügen, alles andere ist markiert als Unverändert.
Code für das hinzufügen der Einheit:
RoleGroup group = Context.RoleGroups.Create();
group.Title = roleGroupName;
Context.Set<RoleGroup>().Add(group);
Context.SaveChanges();
Weiß jemand, warum dies passiert ist?
- Sollten Sie nach dem code, fügt hinzu, dass die Person, die den Kontext
- Können Sie genau das zeigen, was Sie geprüft haben? Ich vermute, Sie haben nur bestätigt, dass die
Role
undUser
Einheiten sind unverändert. - Vielen Dank für die Fragen, ich habe aktualisiert mein Frage etwas mehr Informationen. Hoffentlich das hilft.
- Meinst du
Context.Set<RoleGroup>().Add(group);
? - Da ist zunächst die UsersRoles Tisch, aber dann das snippet bezieht sich auf RoleGroup. Ich auf jeden Fall vermisse hier etwas.
- ja, das ist es, was ich meine. Wird jetzt das update, danke.
- Zychla die UsersRoles Tabelle ist ein link-Tabelle automatisch generiert. Die RoleGroup nichts, das ist, wo bekomme ich die Fehlermeldung Sie versuchen, um eine RoleGroup.
- Ich noch nicht bekommen. Wie kann das hinzufügen einer RoleGroup Ursache der Verletzung der primary key in einer unabhängigen UserRoles-Tabelle?
- Das ist, warum ich bin mit der Frage.
- Wahrscheinlich ist dies NICHT die gezeigten Codeausschnitt, der das Problem verursacht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass die
User
mitUserId = 2beaf837-9034-4376-9510-b1609c54efbe
und dieRole
mitRoleId = dcd16d00-d46e-4d48-8328-3e7b35b11ccf
im StaatUnchanged
bedeutet nicht, dass wird nichts in die Datenbank geschrieben.Besonders für viele-zu-viele-Beziehungen (im Allgemeinen für unabhängige Verbände) EF unterhält ein Staat für die Beziehung selbst die unterscheidet sich von der Person Zustand. Wenn ein Eintrag eingefügt wird in die link-Tabelle bedeutet das, dass die Beziehung Eintritt für zwei Personen in Frage, die im Zustand
Added
obwohl die Entität Staat für diese Entitäten istUnchanged
. Sie können nicht sehen, die Beziehung Eintrag beim aufzählen derDbContext
sChangeTracker
. Es wird nur return entity-Staaten. Sie haben zu gehen, um die zugrunde liegendenObjectContext
- Abfrage für die Beziehung Staat.Beispiel:
Hier
user
undrole
wird sowohl in staatlichenUnchanged
, aber immer noch ein Datensatz eingefügt wird, in der link-Tabelle. Und dieser code wird exception auslösen, wenn der Benutzer 1 Rolle und 5 sind bereits verlinkt in der Datenbank.Hinzufügen der
group
hat nichts mit dem problem zu tun. Nur der AufrufSaveChanges
verursacht die Ausnahme, weil Sie wahrscheinlich erstellt eine Beziehung zwischen zwei Entitäten, die irgendwo vor dem code-Schnipsel in deine Frage.Hinzufügen Slauma Antwort, wie es aussieht, wenn Sie die ICollection-Eigenschaft auf eine dieser automatische viele-zu-viele-Dinge, EF Durcheinander kommt und nicht erkennen, dass Sie die clearing-Sammlungen Elemente, dies zu tun.
Also anstatt dies zu tun:
Haben Sie, um dies zu tun:
Dieser arbeitete für mich.
Sollten Sie nicht haben, um dies zu tun, obwohl. Sollte dies ein Fehler in EF.
Sie versuchen, legen Sie die gleiche Kombination von Benutzername /Rolle in der UserRoles-Tabelle:
Violation of PRIMARY KEY constraint 'PK_UsersRoles'. Cannot insert duplicate key in object 'dbo.UsersRoles'. The duplicate key value is (2beaf837-9034-4376-9510-b1609c54efbe, dcd16d00-d46e-4d48-8328-3e7b35b11ccf). The statement has been terminated.
Überprüfen, um zu sehen, welcher user hat die ID 2beaf837-9034-4376-9510-b1609c54efbe, und welche Rolle hat die ID dcd16d00-d46e-4d48-8328-3e7b35b11ccf.
Wenn Sie sicher sind, dass Sie bisher nur eingetragen, dass der Nutzer erst einmal, wird die Methode fügt die Daten mehr als einmal aufgerufen, ohne Sie zu realisieren?
Hoffnung, dass jemand es nützlich finden, entdeckte ich, dass es einen großen Unterschied zwischen änderung einer bestehenden Liste in der EF im Vergleich zur Erstellung einer neuen Liste.
In diesem Fall machte ich ein update und dachte, dass es am einfachsten zu bauen, eine neue Liste der Elemente, die ich wollte. Aber wenn einige Elemente wurden bereits der Liste Hinzugefügt, ich würde eine primary key-Verletzung beim speichern.
Ich landete halten die gleiche Liste und nur die änderungen. Clearing und readding war ok, eine neue Liste zu erstellen war nicht.