先月、いくつかのバージョンアップグレードを行いましたが、「remove-migration」を使用して移行を削除すると、元に戻したときに、最初にアプリが実行されることに気付きました。
(スタートアップ内でデータベースを更新するため、移行を削除できない状況になりました。移行を削除しようとするたびに、自動的にスタートアップが実行され、dbに移行が適用され、削除に失敗しました。それはdbで見るからです。)
何か案が?
ASP.NET Core 2.1では、メソッドがわずかに変更されました。一般的なメソッドは2.0に似ていますが、メソッド名と戻り値の型のみが変更されています。
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.Build()
.Migrate();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
return new WebHostBuilder()
...; // Do not call .Build() here
}
ASP.NET Core 2.0/EF Core 2.0を使用している場合は、コマンドラインツールがより適切に機能できるように、そのようなケースをより適切にカバーするように変更されました。
このお知らせ でかなりカバーされています。
つまり、アプリケーション全体を構成する静的なBuildWebHost
メソッドがありますが、実行はしません。
public class Program { public static void Main(string[] args) { var Host = BuildWebHost(args); Host.Run(); } // Tools will use this to get application services public static IWebHost BuildWebHost(string[] args) => new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); }
また、EF 2.0では、BuildWebHost
が呼び出された後で、マイグレーションをmainメソッドに移動することが推奨されています。例えば
public static void Main(string[] args)
{
var Host = BuildWebHost(args)
.Migrate();
Host.Run();
}
ここで、Migrate
は拡張メソッドです。
public static IWebHost Migrate(this IWebHost webhost)
{
using (var scope = webhost.Services.GetService<IServiceScopeFactory>().CreateScope())
{
using (var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>())
{
dbContext.Database.Migrate();
}
}
return webhost;
}
これで、アプリケーションが実行されたときにのみ移行が実行されます。コマンドラインツールを実行すると、BuildWebHost
のみが呼び出され、移行は適用されません。