using ErsatzTV.Core; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Services.RunOnce; public class DatabaseMigratorService : BackgroundService { private readonly ILogger _logger; private readonly IServiceScopeFactory _serviceScopeFactory; private readonly SystemStartup _systemStartup; public DatabaseMigratorService( IServiceScopeFactory serviceScopeFactory, SystemStartup systemStartup, ILogger logger) { _serviceScopeFactory = serviceScopeFactory; _systemStartup = systemStartup; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Yield(); _logger.LogInformation("Applying database migrations"); using IServiceScope scope = _serviceScopeFactory.CreateScope(); await using TvContext dbContext = scope.ServiceProvider.GetRequiredService(); await dbContext.Database.MigrateAsync(stoppingToken); await DbInitializer.Initialize(dbContext, stoppingToken); _systemStartup.DatabaseIsReady(); _logger.LogInformation("Done applying database migrations"); } }