sql-server - 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() 之前实现以下目标:
- 更新父级
- 更新已更改的父子记录
- 删除已删除的Parent's Child记录
- 插入已添加的父子记录(ps UpdateRange() 似乎也适用于插入子集合)
有一个更好的方法吗?
谢谢!
解决方案
推荐阅读
- javascript - 圆圈上的百分比动画
- php - 我怎样才能使有效的签名 php openssl
- angular - Angular 8:标头未在 HttpCliet.post 中正确发送
- arrays - 在角度 8 中添加和删除动态数组
- java - 撤消 adview 所做的所有更改
- go - 为什么 emacs-lsp go-mode 在路径中找不到 go 可执行文件?
- python - Python Pandas:为什么我不能将“时间”转换为 to_datetime?不会认时间
- javascript - 如何在 Reactive Forms 中将 Select 中的当前年份设置为默认值?
- git - 如何重新连接到 git repo
- json - 为 SQL 中的 JSON 列创建实体框架 6 的表达式