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>();
});
}
在我的 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>();
});
}