DBContext Savechanges Order of Statement Execution
-
27-10-2019 - |
Frage
Ich habe eine Tabelle mit einem eindeutigen Index auf einer Tabelle mit einer Ordnungsspalte. So hat die Tabelle beispielsweise die folgenden Spalten:
TableId, ID1, ID2, Ordinal
Der eindeutige Index befindet sich über die Spalten ID1, ID2, Ordinal.
Das Problem, das ich habe, ist, dass ich beim Löschen eines Datensatzes aus der Datenbank die Ordinals dann neu durchsetzt habe, so dass sie erneut aufeinanderfolgend sind. Meine Löschfunktion sieht folgendermaßen aus:
public void Delete(int id)
{
var tableObject = Context.TableObject.Find(id);
Context.TableObject.Remove(tableObject);
ResequenceOrdinalsAfterDelete(tableObject);
}
Das Problem ist, dass, wenn ich Context.Savechanges () nenne, den eindeutigen Index bricht, da er die Aussagen in einer anderen Reihenfolge ausführen scheint als sie verabschiedet wurden. Zum Beispiel passiert Folgendes:
- Wiederholung der Ordnungen
- Löschen Sie den Datensatz
Anstatt von:
- Löschen Sie den Datensatz
- Wiederholung der Ordnungen
Ist dies das richtige Verhalten von EF? Und wenn ja, gibt es eine Möglichkeit, dieses Verhalten zu überschreiben, um die Ausführungsreihenfolge zu erzwingen?
Wenn ich das nicht richtig erklärt habe, lassen Sie es mich bitte wissen ...
Lösung
Die Reihenfolge der Befehle wird vollständig von EF kontrolliert. Die einzige Möglichkeit, wie Sie die Bestellung beeinflussen können, besteht darin, separate Savechanges für jeden Vorgang zu verwenden:
public void Delete(int id)
{
var tableObject = Context.TableObject.Find(id);
Context.TableObject.Remove(tableObject);
Context.SaveChanges();
ResequenceOrdinalsAfterDelete(tableObject);
Context.SaveChanges();
}
Sie sollten diesen Code auch in manuell erstellter Transaktion ausführen, um die Atomizität zu gewährleisten (=> TransactionScope
).
Die beste Lösung wäre jedoch wahrscheinlich, die gespeicherte Prozedur zu verwenden, da Ihre Wiederausgleich alle betroffenen Datensätze aus der Datenbank in Ihre Anwendung ziehen, ihre Ordinal ändern und sie einzeln in die Datenbank speichern müssen.
Übrigens. Dies mit Datenbankgerüchen tun. Was ist das Problem mit einer Lücke in Ihrer "ordinalen" Sequenz?