web-dev-qa-db-ja.com

Entity Framework 6で切り離されたエンティティを保存する

Entity Frameworkでの独立したエンティティの保存に関する多くの記事を読みました。それらはすべて、Entity Frameworkの古いバージョンに適用されるようです。それらは、ApplyCurrentValuesやChangeObjectStateなど存在しないように見えるメソッドを参照します。気まぐれに、私はインテリセンスで見つけた方法を試してみることにしました。舞台裏で何が起こっているのか分からないので、これが正しい方法であることを確認したいと思います。

public void SaveOrder(Order order)
{
    using (VirtualWebEntities db = new VirtualWebEntities())
    {
        db.Orders.Attach(order);
        db.Entry(order).State = System.Data.Entity.EntityState.Modified;
        db.SaveChanges();
    }
}

これは、変更された既存のアイテムを更新する正しい方法ですか?

54

はい、これは正しいです。 この記事では、エンティティを追加および添付するさまざまな方法について説明します で、次の例を提供します。

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
    // The next step implicitly attaches the entity
    context.Entry(existingBlog).State = EntityState.Modified;
    // Do some more work...
    context.SaveChanges();
}

EFはどのプロパティがデータベース内のプロパティと異なるかを知らないため、すべてを更新します。

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

これを回避するには、エンティティの状態全体を設定するのではなく、手動で 変更するプロパティを設定する を実行します。

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    context.Entry(blog).Property(u => u.Name).IsModified = true;     
    // Use a string for the property name
    context.Entry(blog).Property("Name").IsModified = true;
}
88