EF Core脚手架生成Razor视图时提示'Primary key not found'
问题原因
ASP.NET Core 基架(脚手架)工具生成控制器与Razor视图的逻辑强依赖实体主键定义,用来生成增删改查、详情、删除等操作的路由绑定和数据操作逻辑。即便你已经在DbContext中为视图映射实体配置了HasNoKey(),基架工具本身不会识别无键实体配置,因此会抛出Primary key not found错误。
配置HasNoKey()只影响EF Core运行时的实体跟踪、查询行为,不会作用于基架生成阶段。
可行解决方案
- 临时修改配置骗过基架生成,完成后回滚
选择实体中可以唯一标识单条记录的非空字段(你的场景中CódigoDoRmm如果满足唯一非空要求即可),临时给字段加[Key]特性,同时注释掉Fluent API中的entity.HasNoKey()配置。
临时修改后的实体示例:
等基架生成完控制器和视图后,删掉临时加的using System; using System.ComponentModel.DataAnnotations; namespace PSWebase2.Models { public partial class ViewCalibraRmm { [Key] // 脚手架生成完成后可删除 public string CódigoDoRmm { get; set; } public DateTime? DataUc { get; set; } public DateTime? DataPc { get; set; } } }[Key]特性,恢复HasNoKey()配置即可。注意生成的控制器中会默认附带新增、编辑、删除这类对视图无效的操作,需要手动删除,只保留列表查询相关的Action。 - 手动编写列表页代码
由于无键实体映射的SQL视图本身只支持查询操作,完全可以跳过基架生成步骤:直接在控制器中写查询逻辑_context.ViewCalibraRmm.ToList()传递给视图,再手动编写Razor页面遍历模型渲染数据即可,省去来回修改配置的步骤,也不会生成冗余的无效操作代码。 - 直接为视图实体配置可用主键
EF Core中为视图映射的实体配置主键,仅用于运行时的变更跟踪、查询结果去重,不会实际在数据库视图上创建主键约束。如果你的视图中存在确定唯一、非空的字段,可以直接将该字段配置为主键,替换掉原来的HasNoKey()配置,基架就能正常识别,运行时也不会报错。比如你的场景中如果CódigoDoRmm满足唯一非空要求,直接写entity.HasKey(e => e.CódigoDoRmm)即可。
注意事项
不要为存在重复值或空值的字段配置实体主键,否则运行时会出现数据重复、实体跟踪异常等问题。如果视图中没有任何可唯一标识单条记录的字段,优先选择前两种方案。
内容的提问来源于stack exchange,提问作者Eduardo Bracho
相关产品推荐
相关产品推荐

