2016-04-13 14 views
0

Ich habe diesen Artikel hilfreich Batch-Einsätze Fastest Way of Inserting in Entity Framework, aber ich frage mich, ob es eine effizientere Möglichkeit zum Einfügen von Datensätzen mit Kind-Entitäten sowie.Schnellste Art der Eingabe viele Eltern und Kind Datensätze

Meine Einheiten sind wie folgt aus:

enter image description here

Ich habe mit BulkInsert experimentiert und es scheint, Leistung ein wenig zu verbessern, aber es ist immer noch etwa 60 Sekunden für etwa 40 Datensätze mit jeweils mehrere Kind Entitäten. Ich habe Fälle, wo ich Tausende von Datensätzen einfügen muss und es kann extrem langsam werden. Mein Code ist wie folgt:

using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 15, 0))) 
{ 
    using (var db = new MyDBContext()) 
    { 
     db.Configuration.AutoDetectChangesEnabled = false; 
     var entities = db.ScenarioCategory.AddRange(categories); 
     db.BulkInsert(entities); 
     db.SaveChanges(); 
    } 
    transactionScope.Complete(); 
} 
+0

Warum rufen Sie sowohl 'AddRange' als auch' BulkInsert' an? Sie sollten eine davon auswählen, da beide dieselbe Operation ausführen. – shlatchz

+0

@SteveGreene Von BulkInsert: "Um Masseneinfügung mit DbContext zu kombinieren, muss TransactionScope verwendet werden." – tqrecords

Antwort

3

Disclaimer: Ich bin der Eigentümer des Projektes Entity Framework Extensions

Hier ist der schnellste Weg zum Einfügen, Aktualisieren, Löschen und Zusammenführung. Sie können es sogar einfacher machen und BulkSaveChanges über SaveChanges verwenden.

// Using BulkSaveChanges 
using (var db = new MyDBContext()) 
{ 
    db.ScenarioCategory.AddRange(categories); 
    db.BulkSaveChanges(); 
} 

// Using BulkInsert on parent then child 
using (var db = new MyDBContext()) 
{ 
    db.BulkInsert(categories); 
    db.BulkInsert(categories.SelectMany(x => x.Items); 
} 
+2

Toller Arbeiter nahm meine Anfrage auf 8 Sekunden! – tqrecords