kann keine Entität mit einem Schlüssel hinzufügen, der bereits verwendet wird

8

Ich habe diesen seltsamen Fehler Cannot add an entity with a key that is already in use Aber was irritiert über diesen Fehler ist, dass der Benutzer keine Details bekommt - Wer? Was? Welcher Tisch? Welcher Datensatz ist der Schuldige dieses Fehlers?

Es wäre sehr kompliziert, es zu bestimmen, falls Sie viele Operationen mit LINQ-Objekten vor .Submit()

durchführen

Gibt es eine Möglichkeit zu bestimmen, was diesen Fehler verursacht hat?

    
igor 11.01.2010, 14:12
quelle

4 Antworten

10

Dieser Fehler tritt normalerweise auf, wenn Sie einen neuen Datensatz in einer MetaTable mit einer Fremdschlüsselbeziehung erstellen und der Fremdschlüsseldatensatz bereits vorhanden ist.

Nehmen wir an, Sie haben beispielsweise eine Kontakttabelle und eine Adresstabelle, und jeder Kontakt kann mehrere Adressen enthalten. Der Fehler tritt auf, wenn Sie einen neuen Kontaktdatensatz erstellen und versuchen, einen vorhandenen Adresseneintrag manuell diesem neuen Kontakt zuzuordnen.

Unter der Annahme, dass die übergebene Adress-ID einen vorhandenen Adressdatensatz darstellt, funktioniert dies nicht:

%Vor%

Historisch gesehen sind SQL-Entwickler darauf trainiert, den ID-Wert einfach zu übergeben, damit die Magie passieren kann. Da bei LINQ-to-SQL die Datenbankaktivität abstrahiert ist, müssen wir das gesamte Objekt übergeben, damit die LINQ-Engine die erforderlichen Änderungen im ChangeSet ordnungsgemäß widerspiegelt. Im obigen Beispiel geht die LINQ-Steuerkomponente davon aus, dass Sie einen neuen Address-Datensatz erstellen möchten, da dieser beim Abschließen von SubmitChanges nicht verwendet wurde und den durch die Fremdschlüsselbeziehung festgelegten Vertrag erfüllen muss. Es erstellt einen leeren Adressdatensatz mit dem übergebenen ID-Wert. Der Fehler tritt auf, weil dieser ID-Wert bereits in der Datentabelle vorhanden ist und das ChangeSet das Adressdelta nicht als Aktualisierung gekennzeichnet hat.

Die Lösung besteht darin, den gesamten Datensatz und nicht nur den ID-Wert zu übergeben:

%Vor%

Jetzt kann die LINQ-Engine den eingehenden Address-Datensatz ordnungsgemäß als einen vorhandenen kennzeichnen und nicht versuchen, ihn neu zu erstellen.

    
Neil T. 11.01.2010 22:42
quelle
1

Möglicherweise ist die Spalte, die Sie versuchen, Attach() , Remove() , Add() oder DeleteOnSubmit() , ein Primärschlüssel, und Sie versuchen, den gleichen Wert erneut hinzuzufügen oder anzuhängen.

Möglicherweise greifen Sie auch auf eine Primärschlüssel- oder Fremdschlüsselwertspalte in einer anderen Methode zu, und sie ist noch nicht geschlossen, wenn Sie versuchen, die oben genannten Methoden aufzurufen.

Versuchen Sie oberhalb dieser Methoden Attach() , Remove() , Add() oder DeleteOnSubmit() , eine neue Instanz Ihres Datenkontextes erneut zu erstellen und auszuführen.

    
Sankar Guda 01.06.2012 09:32
quelle
0

Es hört sich so an, als würden Sie eine Table.Attach () -Methode ausführen, und die Entität, die Sie anhängen, hat einen Schlüsselwert, den L2S bereits verfolgt. Dies hat nichts mit einem doppelten Schlüssel in Ihrer physischen Datenbank zu tun.

    
Randy Minder 11.01.2010 14:16
quelle
0

Wie in einer der obigen Antworten erläutert, ist dieser Fehler eher darauf zurückzuführen, dass versucht wird, einen Datensatz mit einem wiederholten Wert für das primäre ID-Schlüsselfeld in die Tabelle einzufügen. Sie könnten das Problem lösen, indem Sie einen anderen Primärschlüssel auswählen / erstellen.

    
Jean Paul Zambrano 16.09.2015 14:39
quelle

Tags und Links