Nach anderen Fragen (here und here) ist es möglich, eindeutige Schlüsselverletzungen in Entity Framework 6 abzufangen, indem die ausgelöste Ausnahme abgefangen und inspiziert wird InnerException
.Behandeln Sie doppelte Schlüsselverstöße in EntityFramework Core
Wenn DbContext.SaveChanges()
mit einem doppelten Satz von Daten aufrufen, wird eine Ausnahme ausgelöst, aber es ist ein ziemlich Standard InvalidOperationException
, und es ist InnerException
null
ist. Wie kann ich doppelte Schlüsselverletzungen in Entity Framework Core erkennen?
-Update mit mehr Kontext (pun intended)
Die spezifische Verletzung ich zu fangen bin versucht,/erkennen, wenn eine Verbindung zwischen zwei Einheiten Hinzufügen (Team und Benutzer), die durch eine many-to verbunden ist -viele Beziehung.
System.InvalidOperationException: Die Instanz des Entitätstyps 'TeamUser' kann nicht überwacht werden, da bereits eine andere Instanz dieses Typs mit demselben Schlüssel verfolgt wird. Beim Hinzufügen neuer Entitäten wird für die meisten Schlüsseltypen ein eindeutiger temporärer Schlüsselwert erstellt, wenn kein Schlüssel festgelegt ist (d. H. Wenn der Schlüsseleigenschaft der Standardwert für seinen Typ zugewiesen ist). Wenn Sie explizit Schlüsselwerte für neue Entitäten festlegen, stellen Sie sicher, dass sie nicht mit vorhandenen Entitäten oder temporären Werten kollidieren, die für andere neue Entitäten generiert wurden. Achten Sie beim Anhängen vorhandener Entitäten darauf, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert an den Kontext angehängt ist.
Benutzer Entitätsklasse:
public class User
{
[Key]
public string Name { get; set; }
public ICollection<TeamUser> TeamUsers { get; set; }
}
Team-Entity-Klasse:
public class Team
{
[Key]
public string Id { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Template> Templates { get; set; }
public ICollection<Checklist> Checklists { get; set; }
public ICollection<TeamUser> TeamUsers { get; set; }
}
TeamUser Entitätsklasse:
public class TeamUser
{
public string TeamId { get; set; }
public Team Team { get; set; }
public string UserName { get; set; }
public User User { get; set; }
}
Meine DbContext
Unterklasse konfiguriert die many-to-many-Beziehung zwischen Teams und Benutzer:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var teamUserEntity = modelBuilder.Entity<TeamUser>();
teamUserEntity
.HasKey(tu => new { tu.TeamId, tu.UserName });
teamUserEntity
.HasOne(tu => tu.Team)
.WithMany(t => t.TeamUsers)
.HasForeignKey(tu => tu.TeamId);
teamUserEntity
.HasOne(tu => tu.User)
.WithMany(u => u.TeamUsers)
.HasForeignKey(tu => tu.UserName);
}
EF Kern der TeamUser
Tabelle erzeugt hat, wie folgt:
CREATE TABLE "TeamUser" (
"TeamId" TEXT NOT NULL,
"UserName" TEXT NOT NULL,
CONSTRAINT "PK_TeamUser" PRIMARY KEY ("TeamId", "UserName"),
CONSTRAINT "FK_TeamUser_Teams_TeamId" FOREIGN KEY ("TeamId") REFERENCES "Teams" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_TeamUser_Users_UserName" FOREIGN KEY ("UserName") REFERENCES "Users" ("Name") ON DELETE CASCADE
);
CREATE INDEX "IX_TeamUser_UserName" ON "TeamUser" ("UserName");
Haben Sie Ihre eindeutige Constraint-Einstellung in Ihrem db-Kontext eingerichtet? –
Ich meine so etwas wie: entity.HasAlternateKey (p => neue {p.ProductName}). HasName ("U_ProductName"); –
@Herzl Bitte überprüfen Sie die aktualisierte Frage, ich habe die relevanten Entity-Klassen und 'OnModelCreating' Methode hinzugefügt. –