从父实体中删除子实体-EF Core 2.2

时间:2018-12-19 11:43:30

标签: c# asp.net-core entity-framework-core

我想从一个实体中存在的集合中删除一个项目。我面临的问题是:

  

-实体已从上下文中删除

     

-保存更改后,实体仍然存在

父对象:

public class MyObject
{
    public int Id { get; private set; }
    public ICollection<ChildObject> ChildObjcets { get; private set; }

    public void RemoveChildObject(ChildObject @object)
    {
        this.ChildObjcets.Remove(@object);
    }
}

子对象:

 public class ChildObject
 {
    public int Id { get; private set; }

    public MyObject MyObject { get; set; }
    public int MyObjectId { get; set; }
}

我尝试过的事情:

public void Proceed()
{
     //myObject contain 4 child objects inside
     var myObject = _repo.GetMyObject();
     var childObject = _repo.GetChildObject();

     myObject.RemoveChildObject(childObject);
    //myObject contain 3 items now

}

在保存更改之前,我没有在更改跟踪器中看到已删除的实体-应该删除状态吗?

var childObjects = ChangeTracker.Entries().Where(x => x.Entity is ChildObject).ToList(); // returns 3 - the removed one does not exist

但是,当我保存更改时,根对象仍然包含4个实体-因此根本没有删除子对象

_repo.SaveChanges();       
var myObject = _repo.GetMyObject();

有什么想法如何处理从根实体中删除子对象?

2 个答案:

答案 0 :(得分:0)

在Entity Framework 6中,一种更快的操作方法是

context.Children.RemoveRange(parent.Children)

答案 1 :(得分:0)

ChildObject中删除ChildObjcets(也要注意拼写错误)集合意味着删除关系而不是从DbContext中删除实体。要完全删除实体,您需要在Remove上显式调用DbSet<ChildObject>,而您不能直接从根对象执行此操作。

我建议将此操作移至您的_repo实际引用的位置。它应该可以访问DbContext,因此可以访问任何DbSet<>