web-dev-qa-db-ja.com

移行を削除してアプリを実行する理由

先月、いくつかのバージョンアップグレードを行いましたが、「remove-migration」を使用して移行を削除すると、元に戻したときに、最初にアプリが実行されることに気付きました。

(スタートアップ内でデータベースを更新するため、移行を削除できない状況になりました。移行を削除しようとするたびに、自動的にスタートアップが実行され、dbに移行が適用され、削除に失敗しました。それはdbで見るからです。)

何か案が?

10
arielorvits

ASP.NET Core 2.1の更新

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

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のみが呼び出され、移行は適用されません。

25
Tseng