我读过很多关于在实体框架中保存分离实体的帖子。所有这些似乎都适用于旧版本的实体框架。它们引用了诸如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();
}
}
这是更新已更改的现有项目的正确方法吗?
是的,这是正确的。本文介绍了添加和附加实体的各种方法 http://msdn.microsoft.com/en-us/data/jj592676.aspx,它提供了这个例子:
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 时所有属性值都将发送到数据库。
为了避免这种情况,您可以设置修改哪些属性 http://msdn.microsoft.com/en-us/data/jj592677手动而不是设置整个实体状态:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)