Update / UpdateRangeを必要とせずにEntity Framework Core 1.0でレコードを更新する

c# entity-framework entity-framework-core

質問

エンティティフレームワークのコア1.0では、次のようなことがあります。

var products = _context.Products.ToList();
foreach (var prod in products) 
{
     prod.Status = 1;
}
_context.SaveChanges();

私はそれがリストのすべての製品をステータス1に自動的に更新すると信じています。

この場合、AddRange、UpdateRange、Add、Update、Removeなどに何が起こったのですか?これらはもう使用する必要がありますか?エンティティはdbから取得するとすぐに追跡されるため、更新機能は必要ないと感じます。

誰かが私のためにこれをクリアしてもらえますか?私のコードはどこにでもあります。ほとんどの場合、私はUpdateRange関数とUpdate関数を使用していますが、ちょうど最近、_context.SaveChanges()を呼び出す必要があるかもしれません。

今私がこのようなことをすれば:

var products = _context.Products.AsNoTracking().ToList();
foreach (var prod in products) 
{
     prod.Status = 1;
}
// I believe I would have to UpdateRange here...
_context.UpdateRange(products);
_context.SaveChanges();

人気のある回答

Entity Frameworkは、EntityState列挙によって定義される5つの状態のいずれかになります。これらの状態は次のとおりです。

追加:エンティティはコンテキストによって追跡されていますが、データベースにはまだ存在しません。変更なし:エンティティがコンテキストによって追跡され、データベースに存在し、プロパティ値がデータベースの値から変更されていません。エンティティがコンテキストによって追跡され、データベースに存在し、そのプロパティ値の一部またはすべてが変更されたDeleted:エンティティがコンテキストによって追跡され、データベースに存在するがデータベースから削除対象としてマークされている次にSaveChangesが呼び出されたときDetached:エンティティがコンテキストによって追跡されていない

SaveChangesは、異なる状態のエンティティに対して異なる処理を行います。

変更されていないエンティティはSaveChangesには触れられません。 Unchanged状態のエンティティについては、更新はデータベースに送信されません。追加されたエンティティはデータベースに挿入され、SaveChangesが返されるとUnchangedになります。変更されたエンティティはデータベース内で更新され、SaveChangesが返されるとUnchangedになります。削除されたエンティティはデータベースから削除され、コンテキストから切り離されます。

状態をModifiedに変更すると、エンティティのすべてのプロパティが変更済みとしてマークされ、SaveChangesが呼び出されるとすべてのプロパティ値がデータベースに送信されます。

DbSet.AddRange、DbSet.RemoveRangeのいくつかの例を使用することができます:DbSet.AddRangeはエンティティのコレクション(IEnumerable)をDbContextに追加するので、個々のエンティティを個別に追加する必要はありません。

IList<Student> newStudents = new List<Student>();
newStudents.Add(new Student() { StudentName = "Student1 by addrange" });
newStudents.Add(new Student() { StudentName = "Student2 by addrange" });
newStudents.Add(new Student() { StudentName = "Student3 by addrange" });

using (var context = new SchoolDBEntities())
{
    context.Students.AddRange(newStudents);
    context.SaveChanges();
}

DbSet.RemoveRangeは、エンティティのコレクションを削除するために使用されます。

List<Student> existingStudents = …..

using (var context = new SchoolDBEntities())
{
    context.Students.RemoveRange(existingStudents);
        context.SaveChanges();
}

addRange()のパフォーマンスは、12の範囲で優れています。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ