在我的Startup.cs 中,我執行這樣的遷移。私有方法中有一些我無法解釋的奇怪問題,它似乎與呼叫的異步版本有關。以下內容按預期作業(盡管異步性毫無意義。
public async void Configure(
IApplicationBuilder app, IWebHostEnvironment env)
{
...
await MigrateDb(app);
...
}
private static async Task MigrateDb(IApplicationBuilder app)
{
using IServiceScope scope = app.ApplicationServices
.GetService<IServiceScopeFactory>()?.CreateScope();
if (scope == null)
throw new OperationCanceledException();
Context context = scope.ServiceProvider.GetRequiredService<Context>();
context.Database.Migrate();
}
但是,當我應用異步遷移時,東西就會停止作業。出于某種原因,控制器無法訪問,我在每個端點上都收到了 404,包括僅從服務回傳固定字串而與資料庫沒有任何聯系的ping。
private static async Task MigrateDb(IApplicationBuilder app)
{
using ...
Context context = ...
await context.Database.MigrateAsync();
}
谷歌搜索絕對沒有任何相關內容。我嘗試通過scope.Dispose();. 目前我不知道要谷歌搜索什么或如何解決問題。這不是一個關鍵的生產問題 - 我只是在做一個測驗(這部分不是它的目的)。盡管如此,了解為什么會發生這種情況會非常有趣。
uj5u.com熱心網友回復:
我對 Configure 方法有些懷疑。異步任務和異步無效之間有區別。有一個答案async/await - 何時回傳 Task 與 void?將有助于理解這一點。
總體 async void 沒有正確處理 MigrateAsnyc 的異步,這可能會導致問題。
如果我必須嘗試另一種解決方案,那么我將使用 program.cs,您可以嘗試一下。你必須使用你自己的背景關系。
public class Program
{
public static async Task Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
//Migrate database
var scope = host.Services.CreateScope();
var context = scope.ServiceProvider.GetRequiredService<MyContext>();
await context.Database.MigrateAsync();
await host.RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/342787.html
標籤:C# 实体框架 异步 数据库迁移 asp.net-core-5.0
