Asp.net-Core
為什麼刪除遷移執行我的應用程序?
上個月我做了一些版本升級,現在我注意到當我使用“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呼叫並且不會應用遷移。