2017-08-29 96 views
3

我在上个月做了一些版本升级,现在我注意到当我使用“删除迁移”来删除我恢复的迁移时,它首先运行我的应用程序。我注意到因为我们在启动时执行了update-database,所以我遇到了无法删除迁移的情况,因为每次我尝试删除迁移时,它都会自动运行将迁移应用到db的启动,那么它将删除它失败,因为它在db中看到它。)为什么remove-migration运行我的应用程序?

有什么想法吗?

回答

17

如果你使用的是ASP.NET Core 2.0/EF Core 2.0,那么为了更好地覆盖这种情况已经发生了变化,所以命令行工具可以更好地工作。

它在this announcement中的覆盖很好。

归结为有一个静态的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后的迁移移动到主方法被调用。例如

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并且不应用任何迁移。

+2

如果你直接拷贝代码片段,它就是'scope.ServiceProvider.GetRequiredService ()' – IvanJazz

相关问题