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

标签 .net asp.net-core .net-core hangfire

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

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

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddHangfire(x => x.UsePostgreSqlStorage(ConnectionString));
    ...
}

并在配置方法中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    app.UseHangfireServer();
    app.UseHangfireDashboard();
    ...
}

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

我尝试使用:
services.AddHangfire(x => x.UsePostgreSqlStorage(ConnectionString, new PostgreSqlStorageOptions
{
    PrepareSchemaIfNecessary = false
}));

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

我知道对于 Hangfire.SqlServer 有我们可以创建数据库架构的 Install.sql 脚本,但对于 PostgreSql 没有。

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

最佳答案

如果数据库不存在,您可以在 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();
            }
        }
    }
}
然后在配置中使用它:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AppDbContext appDbContext,) 
{
    ...
    ApplyMigrations(appDbContext);
    app.UseHangfireServer();
    app.UseHangfireDashboard();
    ... 
}
您还应该使用 dotnet-ef 工具创建这些迁移。

关于.net - Hangfire .NET Core 数据库不存在 - PrepareSchemaIfNecessary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60676955/

相关文章:

c# - 如何让我的 .NET 应用程序自行清除?

azure - 从 .NET Core 添加自定义维度到 Application Insights 跟踪

apache - 将 Apache 配置为 ASP.NET Core 非 SSL 应用程序的 HTTPS 反向代理是否存在安全问题?

.net - VS 2017 (.net core) 中的 Nuget 包安装失败

c# - 在 C# 中创建应用程序启动器

c# - 使用 Linq 处理列表中的项目组

c# - 修复 RegEx Split() 函数 - 空字符串作为第一个条目

connection-string - xUnit 测试项目连接字符串

c# - WP7 - 从 CSV 文件读取?或者如何处理数据?

sql-server - 在 ASP.Net Core 应用程序中动态更改 SQL Server 连接字符串