Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从父实体中删除子实体-EF Core 2.2_C#_Asp.net Core_Entity Framework Core - Fatal编程技术网

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

C# 从父实体中删除子实体-EF Core 2.2,c#,asp.net-core,entity-framework-core,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 @

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

-正在从上下文中删除实体

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

父对象:

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 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();

知道如何从根实体中删除子对象吗?

在entity Framework 6中,执行此操作的更快方法是

context.Children.RemoveRange(parent.Children)

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


我建议将此操作移动到您的
\u repo
中,不管它实际引用什么。它应该可以访问
DbContext
,因此任何
DbSet

都应该修改更改跟踪器中子实体的状态。在
SaveChanges
之后,应删除数据库中的子实体,并且更改跟踪条目应消失。所有这些只有在cascade delete打开的情况下,你确定你没有用fluent API关闭它吗?你的代码对我来说完美无瑕。该行为正是@IvanStoev所描述的。如果它只是删除了关系,为什么我不能在保存更改之前从上下文中获取所有4个ChildOJBECT?
context.Children.RemoveRange(parent.Children)