You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core修改关联列表类型实体字段后无法保存到数据库如何解决

问题原因

你代码中的Select是LINQ投影操作,仅会生成一个存放新IssueConfirm对象的集合,没有修改EF上下文已经追踪的、从数据库加载的原有IssueConfirms实体的属性,同时你生成的新集合也没有被赋值或加入上下文追踪。EF的变更追踪器感知不到任何实体改动,调用SaveChangesAsync自然不会执行任何数据库更新操作。

解决方法

直接遍历已经通过Include预加载的IssueConfirms关联实体集合,修改每个实体的Status属性即可,EF会自动追踪这些已加载实体的变动,保存时自动生成更新语句。

修正后代码

var vIssues = await _context.Issues
    .Include(x => x.User)
    .Include(x => x.IssueConfirms)
    .FirstOrDefaultAsync(x => x.DepartmentId == departmentId && x.UserId.ToString() == vUserId);

// 增加非空判断避免空引用异常
if (vIssues != null)
{
    // 直接修改已加载的实体属性
    foreach (var confirm in vIssues.IssueConfirms)
    {
        confirm.Status = Enums.Confirm.ConfirmStatus.MailGonderildiBeklemede;
    }
}

await _context.SaveChangesAsync();

高性能优化方案(EF Core 7+支持)

如果不需要加载Issue和IssueConfirms的其他字段做业务逻辑,可直接使用批量更新方法,不用先把实体加载到内存,直接生成SQL执行更新,性能更高:

await _context.IssueConfirms
    .Where(c => c.Issue.DepartmentId == departmentId && c.Issue.UserId.ToString() == vUserId)
    .ExecuteUpdateAsync(s => s.SetProperty(
        c => c.Status, 
        Enums.Confirm.ConfirmStatus.MailGonderildiBeklemede
    ));

内容的提问来源于stack exchange,提问作者Celal Poyraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:54:00