У меня есть веб-приложение в C#, которое подключается к базе данных PostGres с помощью Npg sql .EntityFrameworkCore. PostgreSQL. При локальном запуске я запускаю базу данных, а затем приложение, и все работает нормально. Однако при развертывании оно запускается в настройке docker -compose, и, поскольку приложение запускается быстрее, чем Postgres, происходит сбой с сообщением «В соединении отказано» или «система базы данных запускается».
Моя миграция выглядит примерно так:
public void Migrate()
{
var pendingMigrations = _context.Database.GetPendingMigrations().Count();
if (pendingMigrations > 0)
{
Logger.LogInformation($"Applying {pendingMigrations} migration(s)");
_context.Database.Migrate();
_context.SaveChanges();
Logger.LogDebug($"Database migration complete");
}
else
{
Logger.LogDebug($"No pending migrations");
}
}
А мой startup.cs выглядит так:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextPool<MyDbContext>(options => options.UseNpgsql(MyDbContextFactory.PostgresConnectionString));
services.AddScoped<IMyDb, MyDb>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IMyDb db)
{
...
db.Migrate();
}
Что было бы лучше всего, чтобы гарантировать, что он ждет запуска базы данных вверх? Кажется, я где-то видел что-то вроде запуска вызова Migrate () в al oop и перехвата исключения?