2016-08-03 46 views
0

aufgetreten Ich habe Probleme bei sehr langer Zeit. Stellen wir uns dieses Beispiel vor:Eine Ausnahme vom Typ 'Microsoft.EntityFrameworkCore.DbUpdateException' ist in Microsoft.EntityFrameworkCore.dll

Ich habe zwei Modelle erstellt, und das Modell Planet hat das Modell Coordinate als Attribut. Nun stellen Sie sich vor, irgendwo im Code ich eine Koordinate erstellen und es in der Datenbank gespeichert ist. Stellen Sie sich die Koordinate:

Coordinate c = new Coordinate(); 
c.x = 1; 
c.y = 2; 

Dann wird ich hinzufügen, es auf meine Datenbank und gespeichert.

Aber wenn ich schaffen einen Planeten, und ich tue:

planet.coordinate = c; 

Und dann versuche ich es zu Datenbank hinzuzufügen habe ich den folgenden Fehler:

An exception of type 'Microsoft.EntityFrameworkCore.DbUpdateException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code

Additional information: An error occurred while updating the entries. See the inner exception for details.

Ich weiß, dass ich das Attribut ändern kann public Coordinate coordinate zu public int coordinate_id, aber ich möchte dies stattdessen mit dem Koordinatenmodell tun.

Ich bin mit ASP NET CORE 1.0

Cumps

+0

„Siehe innere Ausnahme für weitere Einzelheiten.“ Also, was sagt es? – DavidG

Antwort

1

Ihr Problem ist, dass zu diesem Zeitpunkt c bereits eine ID hat.

Mit planet.Add werden der Planet und alle damit verknüpften Koordinaten auf Add in DbSets gesetzt und beim Aufruf von SaveChanges werden Insert-Anweisungen erstellt. (Hier gehe ich von einem Autoinkrement für Ihre Spalte und Ihre Id-Eigenschaft aus)

Wenn SaveChanges abgeschlossen ist, wird EF sehen, dass der Planet in der Datenbank ist, aber die ID der gerade hinzugefügten Koordinate ist anders (wurde von DBMS geändert) , also jetzt ist die Koordinate zweimal in Ihrer Datenbank, mit zwei verschiedenen Ids), so wird es erwarten, dass etwas schief gelaufen ist und diese Ausnahme werfen.

Wenn Sie keine Probleme mit doppelten Einträgen haben, die Id auf null gesetzt oder 0 Ansonsten gibt es zwei Lösungen:

-Set nur die FK-Eigenschaft, nicht die Navigationseigenschaft

oder

-Rufen Savechanges nur einmal (zum Beispiel nur die Planeten hinzufügen, jedoch mit zusätzlichen Koordinaten Beziehung Fixup zum gleichen Ergebnis führen soll)

+0

Ich habe gerade festgestellt: Es gibt eine dritte Lösung, indem Sie den EntityState von c auf EntityState.Modified setzen. – DevilSuichiro

+0

Ich mag die dritte Lösung, also wenn ich den Planeten hinzufüge, mache ich "context.Entry (planet.coordinate) .State = EntityState.Modified? –

+0

ja. Allerdings denke ich darüber nach, das würde nur eine DbUpdateConcurrencyException vermeiden und Einträge duplizieren Ich denke, es gibt einen anderen Fehler in Ihrem Code, um eine DbUpdateException zu werfen, sollten Sie sich die InnerException ansehen. – DevilSuichiro

0

einen Blick auf die innere Ausnahme Having werden Sie einen genaueren Blick auf das, was nicht in Ordnung ist.

Dazu im Debug-Modus, wenn die Ausnahme angezeigt wird. Klicken Sie auf Detailansicht und folgen Sie dem Baum, bis Sie die innere Ausnahme finden.

Möglicherweise gibt es doppelte Zeilen, Probleme mit Primärschlüsseln oder Strukturprobleme.

+0

Dies beantwortet die Frage nicht, es gibt nur Debugging-Ratschläge. – DavidG

+0

Ich verstehe David, aber mit niedriger Rep. Ich kann nichts sagen ... also was soll ich tun. – mt025

+0

[Geh und verdiene 50 Wiederholungen] (http://stackoverflow.com/help/whats-reputation), es dauert nicht lange.Sie können dies tun, indem Sie Änderungen an Fragen vorschlagen. Es gibt viele, die Formatierungshilfe benötigen. – DavidG