2013-12-08 142 views
49

我已閱讀大量關於在實體框架中保存分離實體的文章。它們都似乎適用於舊版本的實體框架。它們引用了似乎不存在的方法,如ApplyCurrentValues和ChangeObjectState。心血來潮,我決定嘗試通過我找到智能感知的方法,我要確保這是做正確的方式,因爲我沒有機會看到幕後發生了什麼:在實體框架中保存分離的實體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

感謝。所以我只是想澄清..不再像以前的版本中的applycurrentvalues的概念,你可以通知EF哪些字段改變? – KingOfHypocrites

+1

@KingOfHypocrites你可以,我編輯了我的答案。我建議通過[EF6文檔](http://msdn.microsoft.com/en-us/data/ee712907)查看,它有很多很好的示例和解釋,並且以非常直接的方式編寫。 –

+0

感謝您的鏈接。你的例子唯一的事情就是我必須手動標記每個屬性。舊版本有一個應用值方法,您可以將新對象應用於舊對象。這會自動標記所有更改的屬性,以便在保存時知道要更新的內容。我仍然在尋找相同的東西。 – KingOfHypocrites