首页 > 解决方案 > EF UpdateRange() 不适用于已删除的子集合

问题描述

public Class Parent
{
    public int Id {get;set;}
    public string Name {get;set;}
    public ICollection<Child> Children {get;set;}
}
public Class Child
{
    public int Id {get;set;}
    public int ParentId {get;set;}
    public string Name {get;set;}
}

假设我有 1 Parent,而Parent有 2 Children

Parent
-- Id = 1
-- Name = "Mark"

Child 1
-- Id = 1
-- ParentId = 1
-- Name = "Tom"

Child 2
-- Id = 2
-- ParentId = 1
-- Name = "Jack"

进行以下更改后(删除杰克并将汤姆重命名为路飞:

Parent
-- Id = 1
-- Name = "Mark"

Child 1
-- Id = 1
-- ParentId = 1
-- Name = "Luffy"

Child 2 - Deleted

调用 DbContext.ParentDbSet.UpdateRange(Mark) 将看到 Tom 已成功重命名为 Luffy,但 Jack 仍未删除。

Parent
-- Id = 1
-- Name = "Mark"

Child 1
-- Id = 1
-- ParentId = 1
-- Name = "Luffy"

Child 2
-- Id = 2
-- ParentId = 1
-- Name = "Jack"

我通过在调用 SaveChanges 之前调用 DbContext.ChildDbSet.Remove(Jack) 来解决这个问题。

但是,我试图避免这种情况,因为当我调用 DbContext.ParentDbSet.UpdateRange(Mark) 时,Jack 已经从 Mark 中删除。

目前我再次从数据库中获取旧的标记,将其与更新的标记(已删除 Jack 的标记)进行比较以找出已删除的Child记录,然后调用 RemoveRange(已删除的Child记录)。

这似乎不是一个好主意...

简而言之,我想在调用 SaveChanges() 之前实现以下目标:

  1. 更新父级
  2. 更新已更改的父子记录
  3. 删除已删除的Parent's Child记录
  4. 插入已添加的父子记录(ps UpdateRange() 似乎也适用于插入子集合)

有一个更好的方法吗?

谢谢!

标签: sql-serverentity-framework-core

解决方案


推荐阅读