首页 > 解决方案 > 有没有办法在托管服务启动之前运行实体框架迁移

问题描述

创建 .NET Core 5 应用程序时,我通过在 Startup.Configure (...) 方法顶部执行迁移代码来运行 EF 迁移:

public class Startup 
{
    . . .
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        using (var scope = app.ApplicationServices.CreateScope())
        {
             ApplicationDbContext context = scope.ServiceProvider.GetService<ApplicationDbContext>();
             context.Database.Migrate();
        }
        . . .
    }
}

这一切都运行良好,直到我最近添加了一些依赖于数据库的托管服务和迁移应用的更改。现在,如果我有需要在托管服务启动之前应用的迁移,我的应用程序会在启动时崩溃,因为托管服务在迁移运行之前启动。

有没有办法来解决这个问题?有没有办法在托管服务启动之前运行迁移?

标签: c#.net-coreentity-framework-core

解决方案


经过一番折腾,这个解决方案似乎有效,虽然我对 .NET Core Framework 的了解还不够,无法确定这是否会成为问题:

public class Program
{
    public static void Main(string[] args)
    {
        IHost host = CreateHostBuilder(args).Build();

        IServiceScopeFactory scopeFactory = host.Services.GetService<IServiceScopeFactory>();
        using (var scope = scopeFactory.CreateScope())
        {
            ApplicationDbContext context = scope.ServiceProvider.GetService<ApplicationDbContext>();
            context.Database.Migrate();
        }
        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.AddConsole();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

推荐阅读