こんな感じの Program.cs
にすることでとりあえず実現できた。
ただ、この手法はシングルインスタンスのアプリケーションでの適用に限定しておいた方が良さそうだ。
class Program { public static void Main(string[] args) { var host = BuildWebHost(args); // 起動時にDBマイグレーションを当てる UpdateDatabase(host); host.Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseApplicationInsights() .UseStartup<Startup>() .Build(); private static void UpdateDatabase(IWebHost host) { // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1#call-services-from-main using (var serviceScope = host.Services.CreateScope()) { var services = serviceScope.ServiceProvider; var logger = services.GetRequiredService<ILogger<Program>>(); try { var dbContext = services.GetService<ApplicationDbContext>(); dbContext.Database.OpenConnection(); logger.LogInformation("Start database migration."); // https://docs.microsoft.com/ja-jp/ef/core/managing-schemas/migrations/#apply-migrations-at-runtime // Webアプリケーションではあまり推奨されていない様子。 // 明確なマイグレーションタスクをデプロイパイプラインに含めるのが良いようだ。 dbContext.Database.Migrate(); logger.LogInformation("End database migration."); } catch (Exception ex) { logger.LogError(ex, "An error occurred."); } } } }続きを読む