3
我在上个月做了一些版本升级,现在我注意到当我使用“删除迁移”来删除我恢复的迁移时,它首先运行我的应用程序。我注意到因为我们在启动时执行了update-database,所以我遇到了无法删除迁移的情况,因为每次我尝试删除迁移时,它都会自动运行将迁移应用到db的启动,那么它将删除它失败,因为它在db中看到它。)为什么remove-migration运行我的应用程序?
有什么想法吗?
我在上个月做了一些版本升级,现在我注意到当我使用“删除迁移”来删除我恢复的迁移时,它首先运行我的应用程序。我注意到因为我们在启动时执行了update-database,所以我遇到了无法删除迁移的情况,因为每次我尝试删除迁移时,它都会自动运行将迁移应用到db的启动,那么它将删除它失败,因为它在db中看到它。)为什么remove-migration运行我的应用程序?
有什么想法吗?
如果你使用的是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
并且不应用任何迁移。
如果你直接拷贝代码片段,它就是'scope.ServiceProvider.GetRequiredService()' –
IvanJazz