EF搭配ASP.NET Core 5 MVC如何正确创建多个数据库表
解决方法
不需要从零新建项目,出现该问题的核心原因是:搭建控制器视图的scaffold操作不会自动完成EF Core模型到数据库的结构同步,你漏掉了新表生成的必要流程,按以下步骤操作即可:
1. 先确认新模型已注册到DbContext
打开项目中的自定义DbContext类,检查是否存在对应新模型的DbSet属性,例如新建了Order模型,就必须存在如下代码,缺失则手动补上:
public DbSet<Order> Orders { get; set; }
注意:scaffold控制器时如果选错了DbContext,不会自动添加这段配置,这是最常见的遗漏点。
2. 新增EF Core迁移同步结构
EF Core通过迁移机制跟踪模型变更、同步数据库结构,首次生成库表时已经创建了初始迁移,后续新增模型必须新增对应迁移:
- 打开Visual Studio的包管理器控制台(路径:工具 > NuGet包管理器 > 包管理器控制台),或在项目根目录打开命令行终端
- 执行添加迁移命令,迁移名建议和新增的表/功能对应,方便后续维护:
- 包管理器控制台(PMC)执行:
Add-Migration AddOrderTable - 命令行(dotnet CLI)执行:
dotnet ef migrations add AddOrderTable
- 包管理器控制台(PMC)执行:
- 执行完成后打开项目Migrations文件夹下新生成的迁移文件,检查
Up方法中是否包含创建新表的SQL逻辑,如果是空迁移,回到第一步检查DbSet配置,删除本次空迁移后重新执行添加迁移操作 - 确认迁移逻辑正确后,执行更新数据库命令将结构同步到实际SQL库:
- 包管理器控制台(PMC)执行:
Update-Database - 命令行(dotnet CLI)执行:
dotnet ef database update
- 包管理器控制台(PMC)执行:
3. 排查常见异常点
完成以上步骤还是看不到表、无法访问的话,逐一核对以下配置:
- 核对连接字符串:检查
appsettings.json中配置的数据库连接字符串,确认你在SQL对象资源管理器中连接的是同一个实例、同一个库,不要把localdb和本地命名实例搞混 - 删除EnsureCreated配置:如果项目启动代码中存在
context.Database.EnsureCreated()逻辑,直接删掉。该方法仅在数据库完全不存在时执行建库操作,不会对已有数据库应用后续迁移,会导致结构完全不同步 - 检查控制器注入:打开生成的控制器代码,确认构造函数注入的DbContext类型是你项目中正在使用的自定义上下文,scaffold选错上下文时会生成错误的注入配置
- 核对访问路径:ASP.NET Core 5 MVC默认路由规则为
{controller=Home}/{action=Index}/{id?},例如生成的控制器名为OrdersController,默认访问路径为/Orders,不要输错路径
后续新增任意数据表,只要按照「添加模型类 -> 注册DbSet -> 新增迁移 -> 更新数据库 -> 搭建控制器视图」的流程操作即可,不需要重建项目。
内容的提问来源于stack exchange,提问作者Morfeo
相关产品推荐
相关产品推荐

