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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:03:16