EF MigrateAsync() 使控制器产生 404 Not Found

EF MigrateAsync() makes the controllers producing 404 Not Found

在我的 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,只有 returns 一个固定字符串形成服务,而没有与数据库有任何联系。

private static async Task MigrateDb(IApplicationBuilder app)
{
  using ...
  Context context = ...
  await context.Database.MigrateAsync();
}

谷歌搜索没有给出任何相关信息。我尝试通过 scope.Dispose(); 显式地终止作用域。目前我不知道要 google 获取更多信息或如何进行故障排除。这不是关键的生产问题——我只是在做测试(这部分不是它的目的)。不过,了解为什么会发生这种情况会非常有趣。

我对 Configure 方法有些怀疑。 async task 和 async void 是有区别的。有一个答案async/await - when to return a Task vs 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>();
                });
    }