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
相关产品推荐
相关产品推荐

