web-dev-qa-db-ja.com

Entity Frameworkでレコードを一括更新する方法は?

Entity Frameworkを使用してレコードを一括更新しようとしています。 Entity Framework.Extensions Updateメソッドを試しました。

Updateメソッドは、同じ更新値のセットを持つレコードのセットを一括更新できます。

例:

           Id -  Quantity
Record 1 - A  -  10
Record 2 - B  -  20
Record 3 - C  -  30

上記のすべてのレコードを単純な呼び出しで一括更新できます

Records.Update(new => Record { Quantity = 100 });

Entityframework.Extensionsを使用して、または一括更新をより速く完了する他の方法で、異なる数量で各レコードを一括更新するにはどうすればよいですか?

14
Ujjwal27

SQLステートメントを使用したくない場合は、Attachメソッドを使用して、最初に読み込むことなくエンティティを更新できます。

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;
    }
}
19

ExecuteSqlCommand を使用します。

using (yourDbEntities db = new yourDbEntities())
{
    db.Database.ExecuteSqlCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id);
}

または ExecuteStoreCommand

yourDbContext.ExecuteStoreCommand("UPDATE YourTABLE SET Quantity = {0} WHERE Id = {1}", quantity, id);
17
Salah Akbari

一括更新は、個別の拡張メソッドではなく、シンプルなEFを使用して3つのステップで実行できます。

  • 最初にすべてのエンティティをロードします。
  • 各エンティティでForeachを実行し、そのフィールド値を変更します。
  • Foreachの後、コンテキストの変更を1回保存します。

これにより、複数の更新クエリが単一のバッチで送信されます。

2
Jaswinder

いくつかのプロパティを変更するだけの場合は、この方法を使用します。

   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();
0
Bence Végert