.NET MVC编辑索引时主键值不匹配错误求助(MySQL视图更换后)
解决.NET MVC中EF视图映射的主键不匹配问题
我之前处理过好几次EF和数据库视图映射的类似坑,你这个问题大概率是更换MySQL视图后,Entity Framework对实体主键的识别出现了偏差,导致Find()方法接收的主键参数数量和实体定义的主键数量不匹配。给你几个排查和解决的具体步骤:
1. 先检查EDMX里实体的主键定义
打开你的model.edmx设计界面,找到Graduated_Students实体:
- 右键实体,查看它的键属性,看看是不是被误设置成了复合主键(比如同时把
ID和CohortId都标记为主键) - 如果是复合主键,那你现在只传
id给Find()方法肯定会报错,因为EF需要所有主键字段的值才能定位到唯一实体
2. 确认MySQL视图的唯一标识逻辑
视图本身没有主键,但EF会根据返回列的唯一性自动推断主键:
- 检查你新更换的MySQL视图,确认
ID列是否仍然是唯一的(每一行的ID都不重复) - 如果
ID不再唯一,EF会自动把其他列(比如CohortId)加入主键,形成复合主键,这就是问题的根源
3. 修正EDMX的映射(关键步骤)
如果ID确实是视图的唯一标识,那需要手动修正EDMX的主键映射:
- 在EDMX设计界面,选中
Graduated_Students实体上被错误设为主键的列(比如CohortId),右键取消它的主键属性 - 确保只有
ID列被标记为主键 - 保存EDMX,清理项目后重新生成
如果直接更新模型没生效,可以试试更彻底的方式:
- 先从EDMX里删除
Graduated_Students实体 - 右键EDMX设计界面,选择从数据库更新模型,重新导入你的视图,导入时注意确认主键的选择
4. 必要时调整控制器和视图代码(如果是复合主键)
如果你的视图确实需要复合主键(比如ID+CohortId才能唯一标识一行),那就要修改代码适配:
控制器代码修改:
public ActionResult Details(int? id, int? cohortId) { if (id == null || cohortId == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Graduated_Students graduates = db.Graduated_Students.Find(id, cohortId); if (graduates == null) { return HttpNotFound(); } return View(graduates); }
视图代码修改:
<td> @Html.ActionLink(Resource.Profile, "Details", new { id = item.ID, cohortId = item.CohortId }) @Html.ActionLink(Resource.Edit, "Edit", new { id = item.ID, cohortId = item.CohortId }) @Html.ActionLink(Resource.Delete, "Delete", new { id = item.ID, cohortId = item.CohortId }) </td>
最后验证
修改完成后,清理项目并重新生成,再测试编辑功能,应该就能解决主键数量不匹配的问题了。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

