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

EF Core修改多对多关联时出现Entity type not found错误如何解决

报错原因

你的报错根源是_context.Entry(project.AssignedUsersToProject).State = EntityState.Modified;这行代码的逻辑错误:

  • EF Core的Entry()方法仅接受DbContext中注册的实体类型作为参数(比如你的Project、ApplicationUser都是注册过的实体),但AssignedUsersToProject是ICollection<ApplicationUser>集合类型,并不是你定义的实体,EF自然找不到对应的模型映射,所以抛出了找不到List<ApplicationUser>实体类型的异常。
  • 你之前给单实体标量属性设置EntityState.Modified的逻辑是可行的,但该逻辑完全不适用于集合类导航属性的变更。
正确处理多对多关联变更的方案

EF Core的变更追踪会自动识别已追踪实体的导航属性变化,不需要手动设置关联属性的状态,按场景选择对应方案即可:

场景1:同上下文内操作(先查后改)

如果是在同一个上下文实例中操作,先查询出项目实体时提前加载关联的用户集合,直接操作集合即可:

// 查询项目时提前Include关联的用户集合,让EF追踪关联关系
var existProject = _context.Projects
    .Include(p => p.AssignedUsersToProject)
    .First(p => p.ProjectId == id);

// 直接移除用户即可
var userToRemove = existProject.AssignedUsersToProject.First(u => u.UserName == username);
existProject.AssignedUsersToProject.Remove(userToRemove);

// 修改项目本身的普通属性也可以直接赋值
existProject.ProjectName = project.ProjectName;
existProject.isComplete = project.isComplete;

// 直接保存,EF会自动在中间表生成删除记录
_context.SaveChanges();

场景2:断开连接场景(接口接收前端传的游离实体)

如果是PUT接口接收前端传的游离Project实体,上下文没有追踪过该实体和它的关联,按以下步骤操作:

  1. 先从数据库查询出已存在的项目,同时Include关联的用户集合
  2. 将前端传的项目的标量属性(ProjectName、isComplete等)赋值给查询出来的实体
  3. 对比现有用户集合和前端传的用户集合,做对应的添加/移除操作
  4. 直接保存即可

注意:不要直接操作游离的用户实体,添加/移除用户前先从上下文查询到对应的用户实体再操作,避免EF误判为新增用户导致数据重复。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:36:00