2009-05-28 9 views
14

Ich verwende eine Transaktion, um mehrere Zeilen in mehrere Tabellen einzufügen. Für diese Zeilen möchte ich diese Zeilen der Reihe nach hinzufügen. Beim Aufruf von SaveChanges werden alle Zeilen außerhalb der Reihenfolge eingefügt.Entitätsframework für Zeileneinfügungsaufträge

Wenn Sie keine Transaktion verwenden und Änderungen nach jedem Einfügen speichern, bleibt die Reihenfolge erhalten, aber ich brauche wirklich eine Transaktion für alle Einträge.

+1

Warum ist die Reihenfolge der Einfügung in eine SQL-Datenbank wichtig? –

+5

Die Reihenfolge der Einfügung spielt keine Rolle, jedoch die Reihenfolge der Primärschlüssel. – Wouter

Antwort

9

Die Reihenfolge der Einfügungen/Aktualisierungen und Löschungen im Entity Framework ist abhängig von vielen Dingen im Entity Framework.

Wenn Sie beispielsweise ein neues Produkt in eine neue Kategorie einfügen, müssen Sie die Kategorie vor dem Produkt hinzufügen.

Dies bedeutet, dass, wenn Sie eine große Anzahl von Änderungen haben, lokale Ordnungsbeschränkungen, die wir zuerst erfüllen müssen, und das ist, was wir tun.

Die Reihenfolge, in der Sie mit dem Kontext arbeiten, kann mit diesen Regeln in Konflikt stehen. Wenn Sie zum Beispiel wie folgt vorgehen:

ctx.AddToProducts(
    new Product{ 
     Name = "Bovril", 
     Category = new Category {Name = "Food"} 
    } 
); 

der Effekt ist, dass das Produkt (dem Kontext) zuerst zugegeben wird und dann, wenn wir den Graphen gehen fügen wir die Kategorie zu.

dh dem Einsatz, um in den Kontext ist:

Product 
Category 

aber wegen der referenziellen Integrität müssen wir so neu zu ordnen, bevor sie in die Datenbank einzufügen versuchen:

Category 
Product 

Also das Art der lokalen Nachbestellung ist irgendwie nicht verhandelbar.

Wenn jedoch keine lokalen Abhängigkeiten wie diese bestehen, können Sie theoretisch die Reihenfolge beibehalten. Leider verfolgen wir derzeit nicht, wann etwas dem Kontext hinzugefügt wurde, und aus Gründen der Effizienz verfolgen wir keine Entitäten in auftragserhaltenden Strukturen wie Listen. Daher können wir die Reihenfolge der nicht verwandten Einsätze derzeit nicht beibehalten.

Aber wir haben das gerade erst diskutiert, also bin ich gespannt, wie wichtig das für Sie ist?

this helps

Alex

Program Manager Entity Framework-Team

+0

Danke für die Erklärung. Es würde mir sicherlich einige Zeit sparen, wenn es unterstützt würde, aber ich denke, ich könnte auch meine eigenen benutzerdefinierten Primärschlüssel generieren, um denselben Effekt zu erzielen. – Wouter

+0

Es gibt einige andere Antworten auf die folgende Frage. Ich habe das Problem gelöst, indem ich Zeitstempel oder was nicht anstelle des Primärschlüssels bestellt habe. – Wouter

+3

Irgendwelche Updates dazu? Ich habe eine Situation, in der meine Tabellen eine Einschränkung für einen alternativen Schlüssel haben, so dass keine Beziehung auf dem Modell sichtbar ist. (A. K. ist userName anstelle von userId). Wie kann ich jetzt die Reihenfolge der Einfügungen ändern, wenn ich den Benutzer hinzufüge und den Benutzer dann einer Gruppe hinzufüge, schlägt savechanges fehl. – hazimdikenli

1

ich dabei bin, diese Brücke zu überqueren. Ich ersetze NHibernate durch EF und das Problem, über das ich laufe, ist, wie Listen in die DB eingefügt werden. Wenn ich Elemente zu einer Liste wie folgt (in pseduo-Code) hinzufüge:

list.Add (testObject); list.Add (testObject1);

Ich bin derzeit nicht garantiert, um die gleiche Reihenfolge zu erhalten, wenn "SaveChanges" ausgeführt wird. Das ist eine Schande, da mein Listenobjekt (d. H. Die verknüpfte Liste) die Reihenfolge kennt, in der es erstellt wurde. Objekte, die über Referenzen miteinander verkettet sind, MÜSSEN in derselben Reihenfolge in der Datenbank gespeichert werden. Nicht sicher, warum du erwähnt hast, dass du darüber "debattierst". =)

+0

Ich bin mir nicht sicher, ob er bemerken wird, wenn Sie hier antworten, Sie sollten wahrscheinlich auch seine Antwort kommentieren – Wouter