2017-10-10 2 views
3

Ich muss eine "shift nach Jahr" -Operation in meinem Entity Framework Anwendung implementieren.Aktualisierungsvorgang verletzt eindeutige Bedingung

Dinge zu vereinfachen, nehmen wir an, ich eine Entität/Tabelle, die einen Fremdschlüssel FK zu einem anderen Tisch und ein YEAR (int, int) hat. Benutzer können die Entity Years in die Zukunft verschieben, also muss ich Daten von 2017 bis 2018 kopieren und so weiter.

Es gibt eine Einschränkung in der Datenbank, die besagt, dass das Paar (FK, YEAR) einmalig sein muss.

Wenn ich die "Verschiebung" im Speicher ausführen und die Änderungen mit SaveChanges an die Datenbank senden, erhalte ich einen Fehler von der Datenbank, dass ich die eindeutige Einschränkung verletze. Ich nehme an, dass es versucht, die Aktualisierung Zeile für Zeile, also die Verletzung durchzuführen.

Wenn ich die Sammlung nach Jahr absteigend sortiere (damit keine Duplikate passieren, wenn die Zeilen nacheinander gesendet werden), tritt derselbe Fehler auf.

Meine Abhilfe ist zu die alten Daten löschen und Einsatz neue Daten mit den neuen Jahren, aber ich denke, es könnte eine sauberere Lösung sein ...

+0

haben Sie versucht, diese Einschränkung zuerst zu deaktivieren, die Aktualisierung durchzuführen und dann erneut zu aktivieren? – AgapwIesu

+0

Sie müssten 'identity insert' aktivieren, den Vorgang ausführen und ihn wieder ausschalten – DiskJunky

+0

Sie möchten nicht mehrere Zeilen mit demselben' ID'-Wert haben, vorausgesetzt, dass dies auch Ihr Primärschlüssel ist. Wenn Sie versuchen, einen neuen Datensatz hinzuzufügen, anstatt den vorhandenen Datensatz zu aktualisieren, sollten Sie niemals die gleiche ID haben. Daher ist Ihre eindeutige Bedingung wahrscheinlich sinnlos, da sich der eine Wert immer ändert. Wenn Sie stattdessen diesen Datensatz aktualisieren, haben Sie etwas anderes vor. Wir müssen sehen, wie die Datenbanktabelle definiert ist und welchen Code Sie verwenden, um Ihre ** Schicht ** durchzuführen und zu speichern. – krillgar

Antwort

0

Ich löste das Problem, indem die Reihenfolge Umkehren und Speichern von Element für Element nach dem Ändern. Es ist nicht sehr sauber, so viele SaveChanges auszuführen, aber der Gesamtprozess ist ziemlich komplex und es werden Transaktionen verwendet, also ist das keine große Sache.

Ich musste noch einige Änderungen vornehmen, weil Benutzer Jahre in die Vergangenheit oder in die Zukunft verschieben können. In diesem Fall muss/muss ich die Reihenfolge nicht umkehren, aber um dieses Problem zu vereinfachen, sagen wir, dass es gelöst ist umgekehrt die Bestellung und Artikel für Artikel speichern.

Verwandte Themen