Asp.net-Core

為什麼刪除遷移執行我的應用程序?

  • September 25, 2018

上個月我做了一些版本升級,現在我注意到當我使用“remove-migration”刪除我恢復的遷移時,它首先執行我的應用程序。

(我注意到因為我們在啟動時更新數據庫,所以我遇到了無法刪除遷移的情況,因為每次我嘗試刪除遷移時 - 它都會自動執行將遷移應用到數據庫的啟動,然後刪除失敗它,因為它在 db 中看到它。)

任何的想法?

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 核心 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();
  }

BuildWebHost同樣對於 EF 2.0,現在建議在呼叫後將遷移移至 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呼叫並且不會應用遷移。

引用自:https://stackoverflow.com/questions/45941707