设置EntityState.Unchanged仍出现Duplicate key violation错误如何解决
问题原因分析
- 你当前的实现没有使用
Include预先加载项目的关联用户导航属性,直接给AssignedUsersToProject赋值新的用户集合时,EF Core的变更追踪会把这些已存在的用户关联识别为需要新增的中间表记录,就触发了联合主键重复的报错。 - 手动设置实体为
Unchanged状态只作用于用户/公司本身的实体,不会影响多对多中间表的变更追踪逻辑,所以这个操作解决不了中间表重复插入的问题。
正确实现方案
你不需要手动管理实体状态、也不需要重新给项目赋值关联用户和关联公司属性,直接通过Include加载关联集合后执行移除操作即可,完整修正代码如下:
[HttpPut("removeUser/{username}/{projectID}")] public async Task<IActionResult> RemoveUserFromProject(string username, Guid projectID) { // 预先加载项目的关联用户集合,让EF变更追踪可以监控集合变化 var project = await _context.Projects .Include(p => p.AssignedUsersToProject) .FirstOrDefaultAsync(p => p.ProjectId == projectID); if (project == null) { return NotFound("指定项目不存在"); } var targetUser = project.AssignedUsersToProject.FirstOrDefault(u => u.UserName == username); if (targetUser == null) { return NotFound("该用户未关联当前项目"); } // 直接从已加载的关联集合移除目标用户,EF会自动生成删除中间表记录的SQL project.AssignedUsersToProject.Remove(targetUser); await _context.SaveChangesAsync(); return NoContent(); }
内容的提问来源于stack exchange,提问作者Krellex
相关产品推荐
相关产品推荐

