Skip to content

Instantly share code, notes, and snippets.

@marcin-burak
Created February 17, 2024 09:44
Show Gist options
  • Save marcin-burak/f3cb1c9142050f37cc282faca24757bc to your computer and use it in GitHub Desktop.
Save marcin-burak/f3cb1c9142050f37cc282faca24757bc to your computer and use it in GitHub Desktop.
Entity Framework database initialization on ASP.NET startup
public sealed class DatabaseInitialization(IOptionsSnapshot<SqlServerOptions> sqlServerOptions, IWebHostEnvironment environment, DatabaseContext databaseContext)
{
private readonly IOptionsSnapshot<SqlServerOptions> _sqlServerOptions = sqlServerOptions;
private readonly IWebHostEnvironment _environment = environment;
private readonly DatabaseContext _databaseContext = databaseContext;
public static async ValueTask TryRunDatabaseInitialization(IServiceProvider serviceProvider, CancellationToken cancellationToken)
{
using var dependencyInjectionScope = serviceProvider.CreateScope();
var databaseInitialization = dependencyInjectionScope.ServiceProvider.GetRequiredService<DatabaseInitialization>();
await databaseInitialization.TryRunDatabaseInitialization(CancellationToken.None);
}
private async ValueTask TryRunDatabaseInitialization(CancellationToken cancellationToken)
{
if (_environment.IsProduction() || _sqlServerOptions.Value.RunMigrationsOnStartup is false)
{
return;
}
await _databaseContext.Database.MigrateAsync(cancellationToken);
}
}
// Other code skipped for brevity
await DatabaseInitialization.TryRunDatabaseInitialization(application.Services, CancellationToken.None);
await application.RunAsync(CancellationToken.None);
public sealed class SqlServerOptions
{
public string ConnectionString { get; set; } = string.Empty;
public bool RunMigrationsOnStartup { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment