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:

  1. Wiederholung der Ordnungen
  2. Löschen Sie den Datensatz

Anstatt von:

  1. Löschen Sie den Datensatz
  2. 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 ...

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top