nicht fügen Sie eine Entität mit einem Schlüssel, der bereits in Verwendung ist
Habe ich diese komischen Fehler Cannot add an entity with a key that is already in use
Aber was ziemlich gereizt über die Fehler ist, dass der Nutzer erhält keine detais - Wer? Was? Was für ein Tisch? Welcher Datensatz ist der Schuldige für diesen Fehler?
Wäre es verzweifelt schwierig zu bestimmen, wenn Sie viele Operationen auf LINQ-Objekte vor .Submit()
Gibt es eine Möglichkeit, zu bestimmen, was sicherlich der diesen Fehler verursacht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler tritt normalerweise auf, wenn Sie erstellen einen neuen Datensatz in eine MetaTable mit einer foreign key-Beziehung und die foreign key Datensatz bereits vorhanden ist.
Zum Beispiel, sagen wir, Sie haben eine Kontakt Tabelle und eine Tabelle "Adressen", und jeder Kontakt kann mehrere Adressen. Der Fehler tritt auf, wenn Sie einen neuen Kontakt erstellen, aufzeichnen, und versuchen Sie es manuell zuordnen einer vorhandenen adressdatensatz zu diesem neuen Kontakt.
Unter der Annahme, dass die übergebene Adresse-ID repräsentiert eine vorhandene Adresse aufzeichnen, das funktioniert nicht:
Historisch, SQL-Entwickler trainiert sind, geben Sie nur den ID-Wert in Reihenfolge für Magie passieren. Mit LINQ-to-SQL, weil die Datenbank-Aktivität abstrahiert, die wir zu Durchlaufen haben, das gesamte Objekt so, dass die LINQ-Motor kann ordnungsgemäß die erforderlichen änderungen im ChangeSet. In dem obigen Beispiel, wird die LINQ-engine setzt Voraus, dass Sie gefragt sind, erstellen Sie eine neue Adresse aufzunehmen, da es nicht ein die Arbeit mit, wenn die SubmitChanges gemacht wurde und es zu achten hat, den Vertrag etabliert, die die foreign key-Beziehung. Es erstellt ein leeres Adresse Datensatz mit der übergebenen ID-Wert. Der Fehler tritt auf, weil die ID mit dem Wert der bereits in der Daten-Tabelle und die Änderungen nicht gekennzeichnet die Adresse von delta als ein Update.
Fix ist: im gesamten Datensatz, nicht nur der ID-Wert:
Nun, die LINQ-Motor kann man richtig Flagge die eingehende Adresse Rekord, als eine vorhandene und nicht versuchen, es neu zu erstellen.
Kann die Spalte, die Sie versuchen zu
Attach()
,Remove()
,Add()
oderDeleteOnSubmit()
ist ein Primärschlüssel ist und Sie versuchen, hinzufügen oder Anhängen, den gleichen Wert wieder.Außerdem könnten Sie den Zugriff auf einen primary key oder foreign key-Spalte "Wert" in eine andere Methode und es ist nicht geschlossen, aber wenn Sie versuchen, rufen Sie die oben genannten Methoden.
Oben, um diese Methoden
Attach()
,Remove()
,Add()
oderDeleteOnSubmit()
, versuchen Sie, erstellen Sie eine neue Instanz des datacontext wieder und laufen.Es klingt wie Sie tun, eine Tabelle.Attach() und das Objekt, das Sie anbringen, ist ein zentraler Wert, der L2S ist schon tracking. Dies hat nichts zu tun mit einem doppelten Schlüssel in einer physischen Datenbank.
Wie erklärt, auf einer der oben genannten Antworten, ist dieser Fehler eher aufgrund von versuchen einfügen eines Datensatzes in die Tabelle mit ein wiederholtes Wert auf primary-key-ID-Feld. Sie könnten das problem lösen, indem Sie die Auswahl/Erstellung einer anderen Tabelle ein Primärschlüssel ist.