Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 在实体框架中更新分离的实体_C#_Entity Framework - Fatal编程技术网

C# 在实体框架中更新分离的实体

C# 在实体框架中更新分离的实体,c#,entity-framework,C#,Entity Framework,从数据库加载父对象,然后关闭上下文。在处理这些父母(向他们的孩子添加玩具,玩具可以在孩子之间共享:多对多关系)的某个时间点之后,他们需要更新,每个人只更新一次 public class Parent { public int ParentId { get; set; } public virtual List<Child> Children { get; set; } } public class Child { public int ChildId { g

从数据库加载父对象,然后关闭上下文。在处理这些父母(向他们的孩子添加玩具,玩具可以在孩子之间共享:多对多关系)的某个时间点之后,他们需要更新,每个人只更新一次

public class Parent
{
    public int ParentId { get; set; }
    public virtual List<Child> Children { get; set; }
}

public class Child
{
    public int ChildId { get; set; }

    public int ParentId { get; set; }
    public virtual Parent Parent { get; set; }

    public virtual List<Toy> Toys { get; set; }
}

public class Toy
{
    public int ToyId { get; set; }

    public virtual List<Child> Child { get; set; }
}

它可能变得复杂。见@SteveGreene谢谢,我添加了
ctx.Entry(c.State=EntityState.Modified现在它不会创建重复项,并且工作方式与预期相同。你认为用这种方法可以优化它吗?这就是我们的目的。你可以试试看。有一件事,如果只插入每个孩子的玩具,就没有必要将父母和孩子标记为“已修改”
,应该足以将它们附加到上下文中。
public void UpdateParents(List<Parent> parents)
{
    using (var ctx = new Context())
    {
        foreach (var parent in parents)
        {
            parent.Children.ForEach(c => c.Toys.ForEach(
                t => ctx.Entry(t).State = EntityState.Added));

            ctx.Parents.Attach(parent);
            ctx.Entry(parent).State = EntityState.Modified;
        }

        ctx.SaveChanges();
    }
}
ctx.Entry(c).State = EntityState.Modified;