我在上个月进行了一些版本升级,现在我注意到当我使用“删除迁移”来删除我还原的迁移时,它首先运行我的应用。
(我注意到,因为我们在启动时更新了数据库,所以我遇到了无法删除迁移的情况,因为每次我尝试删除迁移时 - 它会自动运行启动,将迁移应用到db,然后它失败了,因为它在db中看到它。)
任何想法?
答案 0 :(得分:24)
在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,那么可以更好地覆盖这些情况,以便命令行工具可以更好地工作。
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
后将迁移移至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
并且不应用任何迁移。