EF Core如何在.NET 6 API启动时自动执行生产环境缺失的迁移?
.NET 6 API生产环境启动自动执行未完成数据库迁移的实现方案
直接上实操步骤:
核心实现:在Program.cs中添加迁移执行逻辑
.NET 6用顶级语句简化了Program.cs,你只需要在应用构建完成后、启动前,添加一段自动迁移的代码:
var builder = WebApplication.CreateBuilder(args); // 先注册你的数据库上下文(这里以SqlServer为例,换成你用的数据库) builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 其他服务注册(比如Controllers、Swagger这些)... var app = builder.Build(); // 关键:执行未完成的迁移 using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>(); // Migrate方法会自动检测并执行所有未应用的迁移 dbContext.Database.Migrate(); } // 中间件配置(比如路由、授权、静态文件)... app.Run();
生产环境必注意的细节
- 连接字符串权限:生产环境的数据库账号必须有执行迁移的权限(创建/修改表、索引等),但别用超级管理员账号,遵循最小权限原则。
- 迁移文件必须部署:开发环境生成的
Migrations目录下的所有.cs文件,要和代码一起部署到生产服务器,不然Migrate()找不到要执行的迁移脚本。 - 异常处理:如果迁移失败,最好加个try-catch记录日志,甚至终止应用启动,避免数据库状态异常时服务运行:
using (var scope = app.Services.CreateScope()) { var services = scope.ServiceProvider; var dbContext = services.GetRequiredService<YourDbContext>(); var logger = services.GetRequiredService<ILogger<Program>>(); try { dbContext.Database.Migrate(); logger.LogInformation("数据库迁移执行成功"); } catch (Exception ex) { logger.LogCritical(ex, "数据库迁移失败,应用启动终止"); throw; // 抛出异常让应用停止,避免带病运行 } } - 仅生产环境执行:如果只想在生产环境触发自动迁移,可以通过环境判断:
var env = app.Services.GetRequiredService<IWebHostEnvironment>(); if (env.IsProduction()) { // 上面的迁移代码放这里 }
可选替代方案
如果不想让应用自己执行迁移(比如需要审批流程),可以:
- 在部署脚本里手动跑
dotnet ef database update命令,前提是服务器安装了.NET SDK。 - 把迁移步骤集成到CI/CD管道(比如GitHub Actions、Azure DevOps),部署前自动执行迁移。
内容的提问来源于stack exchange,提问作者Athit Upakan
相关产品推荐
相关产品推荐

