如何在实体框架中使用父项更新子项

时间:2019-01-27 20:33:53

标签: asp.net-mvc entity-framework

我有一个复杂的类,当我在View中更新数据并将其保存到数据库时,Entity将其保存两次子类数据。

public class Parent
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<Children> Children { get; set; }
}

public class Children
{
    public int ID { get; set; }
    public string Name { get; set; }
}

 var v = context.Parent.Include(c=>c.Children);
 return View(v)

查看文件包含此

@model Parent
<input asp-for=Parent.Name >
for(int i; i<Model.Child.Count();i++)
{
    <input asp-for=Parent.Child[1].Name />
}

我非常简化了课程。 如果在浏览器(视图)中更改父级和子级名称,它将更新父级名称,但为子级插入新名称,而不是更新子级名称。每当我更改孩子的名字时,都会向数据库中添加新的孩子。

public void Save(Parent parent)
{
   if (Parent.ID== 0)
   {
       context.Parent.Add(parent);
   }
   else
   {
       Paret dbEntry = context.Parent.FirstOrDefault(a => a.ID== parentID);
       if (dbEntry != null)
       {
                dbEntry.ID= parent.ID;
                dbEntry.Name= parent.NAme;
                dbEntry.Children = parent.Children;
        }
     }

     context.SaveChanges();
}

1 个答案:

答案 0 :(得分:0)

这是因为dbEntry.Children = parent.Children;行将子级添加为新子级,而不是更新现有子级。

您可以如下解决此问题:

public void Save(Parent parent)
{ 
    if (Parent.ID== 0)
    {
       context.Parent.Add(parent);
    }
    else
    {
       Parent dbEntry = context.Parent.Inlcude(p => p.Children).FirstOrDefault(a => a.ID== parentID);

       if (dbEntry != null)
       {
            dbEntry.ID= parent.ID;
            dbEntry.Name= parent.NAme;

            dbEntry.Children.Clear() // It will clear the children before adding the updated version of the children.

            dbEntry.Children = parent.Children;
        }
    }
    context.SaveChanges();
}