如何使用EF Core保存附加实体时删除子实体

时间:2018-04-05 18:07:20

标签: entity-framework entity-framework-core

我有一个使用EF Core的存储库。在下面的场景中,我首先获取一个实体以及一个相关的子集合。然后我删除所有子项并添加一个新子项,并在父实体上更新一个属性。

在父级更新后保存属性后,将添加新的子实体,但所有原始子实体仍在数据库中。

如何让EF跟踪已删除的子实体?

class Repository
{
    public Parent GetParent(int id)
    {
        using (var db = new LocalDbContext())
        {
            return db.Parents.Include(item => item.Images).FirstOrDefault(item => item.Id == id);
        }
    }

    public void UpdateParent(Parent parent)
    {
        using (var db = new LocalDbContext())
        {
            var entry = db.Parents.Attach(parent);
            entry.State = EntityState.Modified;
            db.SaveChanges();
        }
    }
}


var instance = new LocalDbContext();
var repository = new Repository();
var parent = repository.GetParent(123);
parent.SomeField = 999;
parent.Children.RemoveRange(0, parent.Children.Count);
parent.Children.Add(new Child() { SomeOtherField = "qwe" });
repository.UpdateParent(parent);

1 个答案:

答案 0 :(得分:2)

致电

db.Children.RemoveRange(parent.Children);

应从数据库中删除子实体。

在存储库中添加方法:

public void RemoveChildren(IEnumerable<Children> children)
{
   using(var db = new LocalDbContext())
   {
       db.Children.RemoveRange(children);
       db.SaveChanges();
   }
}

并使用它:

var parent = repository.GetParent(123);
repository.RemoveChildren(parent.Children);