Einfügereihenfolge mehrerer Datensätze in Entity Framework

8

Ich habe Probleme mit der Neuanordnung meiner Einfügungen durch EF, wenn ich versuche, eine Entität mit mehreren untergeordneten Elementen gleichzeitig hinzuzufügen. Ich habe eine 3-Level-Struktur mit Eins-zu-viele-Beziehungen zwischen jedem ( Outer 1--* Item 1--* SubItem ). Wenn ich versuche, ein neues Outer mit Items und Subitems einzufügen, werden die Items, die SubItems enthalten, zuerst eingefügt.

Beispielcode (.NET 4.5, EF 5.0.0-rc):

%Vor%

Ich kenne diese Antwort von Alex James , die besagt, dass Einfügungen möglicherweise neu geordnet werden müssen, um zu befriedigen relationalen Zwängen, aber das ist nicht das Problem hier. Seine Antwort erwähnt auch, dass sie die Reihenfolge der Elemente in auftragserhaltenden Strukturen wie Listen nicht verfolgen können.

Was ich gerne wissen würde ist, wie ich diese Einsätze bestellen kann. Während ich mich darauf verlassen kann, meine eingefügten Artikel nach einem anderen Feld als dem PK zu sortieren, ist es viel effizienter, wenn ich mich auf den PK-Auftrag verlassen kann. Ich möchte nicht wirklich mehrere SaveChanges-Aufrufe verwenden müssen, um dies zu erreichen.

Ich benutze EF5 RC, aber nach den anderen unbeantworteten Fragen zu urteilen, gibt es das schon seit einiger Zeit!

    
Richard 17.07.2012, 10:56
quelle

2 Antworten

5
  

Was ich gerne wissen würde ist, wie ich diese Einsätze bestellen kann.

Sie können nicht. Reihenfolge der Datenbankbefehle ist das interne Verhalten der EF. Wenn Sie die Reihenfolge der Befehle steuern möchten, verwenden Sie keine Werkzeuge, die Sie von Datenbankinteraktionen auf niedriger Ebene abstrahieren - verwenden Sie SQL direkt.

Bearbeiten basierend auf Kommentar:

Ja, es handelt sich um eine Interaktion auf niedriger Ebene, weil Sie bei der Arbeit mit Abstraktionen, die Sie nicht unter Ihrer Kontrolle haben, Erwartungen in die Reihenfolge der SQL-Befehle setzen. Auf hohem Niveau erhältst du etwas anderes, weil du Erwartungen verwendest, die mit dieser Abstraktion nicht funktionieren. Wenn Sie die Reihenfolge der SQL-Befehle steuern wollen, müssen Sie entweder EF erzwingen, indem Sie Elemente einzeln speichern (= & gt; multiple SaveChanges und TransactionScope ) oder SQL selbst schreiben. Andernfalls verwenden Sie eine separate Spalte für die Bestellung.

Übrigens. EF speichert das Objekt nicht so, wie Sie es sehen. Es verfügt über einen eigenen Change Tracker, der Verweise auf alle angehängten Instanzen enthält. Referenzen werden in mehreren Dictionary Instanzen gehalten und das Wörterbuch nicht Reihenfolge der Anzeigen beibehalten Wenn diese Sammlungen zum Generieren von SQL-Befehlen verwendet werden (und ich nehme an, sie sind es), kann keine Bestellung garantiert werden.

    
Ladislav Mrnka 17.07.2012 11:50
quelle
1

Tabellen in der Datenbank sind Mengen. Das bedeutet, dass die Bestellung nicht garantiert ist. Ich nehme in Ihrem Beispiel an, dass Sie die Ergebnisse nach "Anzahl" geordnet haben möchten. Wenn Sie das wollen, was werden Sie tun, wenn sich diese Zahl ändert und sie nicht mehr die Reihenfolge in der Datenbank widerspiegelt?

Wenn Sie die Zeilen wirklich in einer bestimmten Reihenfolge einfügen möchten, sind mehrere SaveChanges die beste Wahl.

Der Grund, warum SaveChanges mehrfach nicht aufgerufen werden soll, liegt darin, dass es genau so ist, wie es ist: ein schmutziger Hack.

Da es sich bei einem Primärschlüssel um ein technisches Konzept handelt, sollte es keinen Sinn machen, die Ergebnisse auf diesem Schlüssel trotzdem zu ordnen. Sie können die Ergebnisse nach einem bestimmten Feld sortieren und dafür einen Datenbankindex verwenden. Sie werden wahrscheinlich nicht den Unterschied in der Geschwindigkeit sehen.

Die explizite Bestellung hat noch weitere Vorteile: es ist leichter für Menschen zu verstehen, die es pflegen müssen. Andernfalls muss diese Person wissen, dass die Reihenfolge auf dem Primärschlüssel wichtig ist und die richtigen Ergebnisse liefert, da sie in einem anderen (vollständig) nicht verwandten Abschnitt Ihrer Anwendung zufällig die gleiche Reihenfolge wie das Zahlenfeld aufweist.

    
Jeroen 17.07.2012 11:18
quelle