Ich versuche, Datensätze massenweise mit Entity Framework zu aktualisieren. Ich habe die Entity Framework.Extensions Update
-Methode ausprobiert.
Die Update
-Methode kann eine Massenaktualisierung für einen Datensatzsatz mit denselben Aktualisierungswerten durchführen.
Beispiel:
Id - Quantity
Record 1 - A - 10
Record 2 - B - 20
Record 3 - C - 30
Wir können alle oben genannten Datensätze massenweise durch einfaches Aufrufen aktualisieren
Records.Update(new => Record { Quantity = 100 });
Wie kann ich jeden Datensatz mit unterschiedlicher Menge per Entityframework.Extensions
oder in einem anderen Ansatz aktualisieren, wodurch die Massenaktualisierung schneller abgeschlossen wird?
Wenn Sie keine SQL-Anweisung verwenden möchten, können Sie die Methode Attach verwenden, um eine Entität zu aktualisieren, ohne sie vorher laden zu müssen:
using (myDbEntities db = new myDbEntities())
{
try
{
//disable detection of changes to improve performance
db.Configuration.AutoDetectChangesEnabled = false;
//for all the entities to update...
MyObjectEntity entityToUpdate = new MyObjectEntity() {Id=123, Quantity=100};
db.MyObjectEntity.Attach(entityToUpdate);
//then perform the update
db.SaveChanges();
}
finally
{
//re-enable detection of changes
db.Configuration.AutoDetectChangesEnabled = true;
}
}
Verwenden Sie ExecuteSqlCommand
:
using (yourDbEntities db = new yourDbEntities())
{
db.Database.ExecuteSqlCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id);
}
Oder ExecuteStoreCommand
:
yourDbContext.ExecuteStoreCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id);
Die Massenaktualisierung kann in drei Schritten mit einfachen EF anstelle von separaten Erweiterungsmethoden durchgeführt werden: -
Dadurch werden mehrere Aktualisierungsabfragen in einem Stapel gesendet.
Verwenden Sie diese Methode, wenn Sie nur einige Eigenschaften ändern möchten:
foreach (var vSelectedDok in doks)
{
//disable detection of changes to improve performance
vDal.Configuration.AutoDetectChangesEnabled = false;
vDal.Dokumente.Attach(vSelectedDok);
vDal.Entry(vSelectedDok).Property(x=>x.Status).IsModified=true;
vDal.Entry(vSelectedDok).Property(x => x.LastDateChanged).IsModified = true;
}
vDal.SaveChanges();