Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架6中保存分离的实体_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 在实体框架6中保存分离的实体

C# 在实体框架6中保存分离的实体,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我已经阅读了很多关于在实体框架中保存分离实体的帖子。所有这些似乎都适用于实体框架的旧版本。它们引用的方法,如ApplyCurrentValues和ChangeObjectState,这些方法似乎不存在。一时兴起,我决定尝试一种通过intellisense找到的方法,我想确保这是正确的方法,因为我看不到幕后发生了什么: public void SaveOrder(Order order) { using (VirtualWebEntities db = new VirtualWebEnti

我已经阅读了很多关于在实体框架中保存分离实体的帖子。所有这些似乎都适用于实体框架的旧版本。它们引用的方法,如ApplyCurrentValues和ChangeObjectState,这些方法似乎不存在。一时兴起,我决定尝试一种通过intellisense找到的方法,我想确保这是正确的方法,因为我看不到幕后发生了什么:

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();
    }
}
这是更新已更改的现有项目的正确方法吗?是的,这是正确的,它提供了一个例子:

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时,所有属性值都将发送到数据库

为了避免这种情况,您可以手动而不是设置整个实体状态:

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

谢谢所以我只想澄清。。在以前的版本中,不再有applycurrentvalues的概念,您可以通知EF哪些字段已更改?@KingOfHypocrites您可以,我已经编辑了我的答案。我建议浏览一下,它有很多很好的例子和解释,并且写得非常简单。谢谢链接。您的示例中唯一的一点是,我必须手动标记每个属性。旧版本在这里有一个apply values方法,您可以将新对象应用到旧对象。这将自动标记任何更改的属性,以便在保存时知道要更新的内容。我还在搜索一个等价的。@KingOfHypocrites我链接的第二篇文章(“使用属性值”)展示了使用其他对象和字典设置属性的几种方法,包括
entity.CurrentValues.Set(order)
。我想这就是你要找的。如果从附加实体开始,它将以
EntityState.Unmodified
开始。然后使用您选择的任何方法设置属性。该实体将被标记为已修改,并且只更新那些已更改的属性。@Niklauswith如果修改订单行实体,则应将订单行实体标记为已修改,而不是在父实体上标记导航属性。