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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:17:40