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;