我想从一个实体中存在的集合中删除一个项目。我面临的问题是:
-实体已从上下文中删除
-保存更改后,实体仍然存在
父对象:
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();
有什么想法如何处理从根实体中删除子对象?
答案 0 :(得分:0)
在Entity Framework 6中,一种更快的操作方法是
context.Children.RemoveRange(parent.Children)
答案 1 :(得分:0)
从ChildObject
中删除ChildObjcets
(也要注意拼写错误)集合意味着删除关系而不是从DbContext
中删除实体。要完全删除实体,您需要在Remove
上显式调用DbSet<ChildObject>
,而您不能直接从根对象执行此操作。
我建议将此操作移至您的_repo
实际引用的位置。它应该可以访问DbContext
,因此可以访问任何DbSet<>
。