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实体,上下文没有追踪过该实体和它的关联,按以下步骤操作:
- 先从数据库查询出已存在的项目,同时Include关联的用户集合
- 将前端传的项目的标量属性(ProjectName、isComplete等)赋值给查询出来的实体
- 对比现有用户集合和前端传的用户集合,做对应的添加/移除操作
- 直接保存即可
注意:不要直接操作游离的用户实体,添加/移除用户前先从上下文查询到对应的用户实体再操作,避免EF误判为新增用户导致数据重复。
内容的提问来源于stack exchange,提问作者Krellex
相关产品推荐
相关产品推荐

