2013-12-08 138 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