EF Core CRUD Scaffold:如何在视图中显示主键并控制视图数据?
EF Core 数据库优先模式下控制视图展示内容的方法
1. 修改T4模板(最灵活的长期方案)
EF Core用Scaffold-DbContext生成代码时,默认模板会跳过主键的视图展示逻辑。你可以自定义T4模板来解决:
- 找到EF Core自带的T4模板(在
Microsoft.EntityFrameworkCore.TemplatesNuGet包里,或者用-Template参数指定自己的模板文件) - 打开模板,找到生成实体属性的循环部分,添加判断逻辑:如果属性是主键,就保留生成对应的视图展示代码,不要跳过
- 这样后续每次重新生成代码,主键都会自动出现在视图里
2. 手动修改生成后的代码(临时快速方案)
不想折腾模板的话,生成完代码直接手动调整:
- 查看生成的实体类,确保主键属性没有被添加隐藏类注解,或者手动加
[Display(Name = "主键ID")]指定显示名称 - 打开Razor视图,手动添加主键的展示代码,比如:
<div class="form-group"> <label asp-for="Id" class="control-label"></label> <input asp-for="Id" class="form-control" readonly /> <span asp-validation-for="Id" class="text-danger"></span> </div> - 注意:下次重新生成代码时,这些修改会被覆盖,只适合临时场景使用
3. 用数据注解控制显示
在生成的实体类上添加数据注解,强制让主键显示:
- 给主键属性添加
[Display]注解,指定自动生成字段:[Key] [Display(Name = "用户ID", AutoGenerateField = true)] public int Id { get; set; } - 同样,重新生成代码会覆盖这些注解,适合临时场景,或者结合T4模板自动插入注解
4. 自定义视图模型(最稳妥的长期方案)
自己创建视图模型(ViewModel),按需添加需要展示的字段(包括主键),再把实体数据映射过去:
- 先定义ViewModel:
public class UserViewModel { public int Id { get; set; } // 包含主键 public string Username { get; set; } public string Email { get; set; } } - 控制器中将实体转换为ViewModel:
var user = _context.Users.FirstOrDefault(u => u.Id == id); var viewModel = new UserViewModel { Id = user.Id, Username = user.Username, Email = user.Email }; return View(viewModel); - 这种方式完全不受EF Core生成代码的影响,后续无论怎么重新生成,都不会打乱视图展示逻辑
内容的提问来源于stack exchange,提问作者Kevin S. Miller
相关产品推荐
相关产品推荐

