2013-12-08 13 views
49

Entity Frameworkで分離されたエンティティを保存する際の投稿のLOTSを読みました。それらのすべては古いバージョンのEntity Frameworkに適用されるようです。これらは、存在しないように見えるApplyCurrentValuesやChangeObjectStateなどのメソッドを参照します。気まぐれで私はインテリセンスで見つかったと、私はこれは私が舞台裏で起こってものを見るために得ることはありませんので、これを行うには正しい方法で確認する方法を試してみることにした。Entity Framework 6に分離されたエンティティを保存します。

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(); 
    } 
} 

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

答えて

80

はい、これは正しいです。 This article describes various ways of adding and attaching entities、そしてそれは、この例を提供します。

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は、データベース内のものとは異なっている特性を知らないので、それはそれらのすべてを更新します:あなたが変更に状態を変更

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

これを回避するには、することができます set which properties are modified手動で全体ではなく、エンティティの状態設定より:

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; 
} 
+0

感謝を。だから私は明確にしたいだけです。どのフィールドが変更されたかをEFに知らせることができる以前のバージョンのように、もはやapplycurrentvaluesの概念はありません。 – KingOfHypocrites

+1

@KingOfHypocritesできます、私は私の答えを編集しました。私は[EF6 documentation](http://msdn.microsoft.com/en-us/data/ee712907)を見てみることをお勧めします。これには多くの良い例と説明があり、非常に簡単な方法で書かれています。 –

+0

リンクありがとうございます。あなたの例の唯一の事は、私は手動で各プロパティをマークする必要があるということです。古いバージョンにはapply valuesメソッドがありました。ここで新しいオブジェクトを取得して古いオブジェクトに適用できます。これにより、変更されたプロパティが自動的にマークされ、保存時に更新する内容がわかります。私はまだ同等のものを探しています。 – KingOfHypocrites

関連する問題