2016-06-06 7 views
0

Aktualisierung habe ich eine Tabelle, deren Werte bedingte Basis aktualisiert, und wenn ichEF 6 Performance während mehrerer Datensätze mit unterschiedlichen Werten in derselben Tabelle

db.SaveChanges() 

es nenne ist ein enormer Leistungsabfall.

Ich bin auch festigende Eigenschaften

db.Configuration.AutoDetectChangesEnabled = false;     
db.Configuration.ValidateOnSaveEnabled = false; 

noch Ergebnisse nicht wie erwartet.

Edit 1:

using(var db= new MyEntities()) 
{ 
    db.Configuration.AutoDetectChangesEnabled = false;     
    db.Configuration.ValidateOnSaveEnabled = false; 

foreach(var acc in myacclist) 
{ 
    //will update my account objects here 
} 
    db.SaveChanges(); 
} 
+0

möchten Sie vielleicht mit uns den umgebenden Code teilen . SaveChanges() macht eine Menge Dinge, während die Leistung davon hauptsächlich vom internen Kontextstatus und der Verbindungsbehandlung abhängt. – DevilSuichiro

+0

Myacclist hat 100000 Artikel? –

+0

Es wird mehr als 10000 Konten haben und manchmal mehr als 50k – Nagaraj

Antwort

1

Leider gibt es keine Möglichkeit, Sie werden eine gute Leistung zu haben, mit Entity Framework in der Lage und Savechanges.

Mit SaveChange wird ein Datenbank-Roundtrip für jede Datensatzaktualisierung durchgeführt. Wenn Sie also 10.000 Konten haben, wird ein 10k-Datenbank-Round-Trip durchgeführt.

Einstellung AutoDetectChangesEnabled und ValidateOnSaveEnabled ist in der Regel eine sehr schlechte Idee und wird nicht wirklich die Leistung verbessern, da es die Anzahl der Datenbank Round-Trip das eigentliche Problem ist.

Haftungsausschluss: Ich bin der Besitzer des Projekts Entity Framework Extensions

Diese Bibliothek dramatisch die Leistung zu verbessern, indem ermöglicht:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

Beispiel:

using(var db= new MyEntities()) 
{ 
    foreach(var acc in myacclist) 
    { 
     //will update my account objects here 
    } 

    db.BulkSaveChanges(); 
} 
0

Aufbau einer Aktualisierungsabfrage in String-Builder und es für alle 1k Aufzeichnungen Speichern verbessert meine Leistung

using (var db = new MyEntities()) 
{ 
    StringBuilder finalquery = new StringBuilder(); 
    int i = 0; 
    foreach (var acc in myacclist) 
    { 
     i++; 
     //will update my account objects here 
     finalquery.Append(stmnt); 
     if (1 % 1000 = 0) { db.Database.ExecuteSqlCommand(finalquery.ToString()); } 
     } 

     db.SaveChanges(); 
} 
Verwandte Themen