gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:56:44 30 4
gpt4 key购买 nike

我有一个托管在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com