Hangfire .NET Core 数据库不存在-PrepareSchemaIfNecessary

Hat*_*ori 6 .net hangfire .net-core asp.net-core

我有一个 .NET Core Web 应用程序,托管在 docker 映像上。该应用程序使用托管在云数据库服务上的 PostgreSQL。

我们添加了 Hangfire,它将使用与我们的主应用程序相同的云数据库服务。

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHangfire(x => x.UsePostgreSqlStorage(ConnectionString));
    ...
}
Run Code Online (Sandbox Code Playgroud)

并在配置方法中:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    app.UseHangfireServer();
    app.UseHangfireDashboard();
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们的数据库服务不可用(或者数据库不存在),我们在启动应用程序时会遇到问题。

我尝试使用:

services.AddHangfire(x => x.UsePostgreSqlStorage(ConnectionString, new PostgreSqlStorageOptions
{
    PrepareSchemaIfNecessary = false
}));
Run Code Online (Sandbox Code Playgroud)

但现在一旦数据库服务启动并运行,我就无法创建数据库架构。我找不到 Hangfire.PostgreSql 的任何迁移脚本,因此我可以将它们与其他业务迁移一起推送。

我知道对于 Hangfire.SqlServer 有 Install.sql 脚本,我们可以用它创建数据库模式,但对于 PostgreSql 没有。

在 CI/CD 管道中,我们希望首先构建并运行应用程序,然后在数据库服务上应用迁移脚本,因此在启动应用程序时我们没有可用的数据库。

小智 0

如果数据库不存在,您可以在 Startup.cs 中使用hangfire 服务器之前使用 EF 应用迁移。

public void ApplyMigrations(AppDbContext context)
{
    try
    {
        if (context.Database.GetPendingMigrations().Any())
        {
            context.Database.Migrate();
        }
    }
    catch (Npgsql.PostgresException ex)
    {
        if (ex.SqlState == "42P07")
        {
            context.Database.EnsureDeleted();
            if (context.Database.GetPendingMigrations().Any())
            {
                context.Database.Migrate();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在配置中使用它:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AppDbContext appDbContext,) 
{
    ...
    ApplyMigrations(appDbContext);
    app.UseHangfireServer();
    app.UseHangfireDashboard();
    ... 
}
Run Code Online (Sandbox Code Playgroud)

您还应该使用 dotnet-ef 工具创建这些迁移。