ASP 具有 Entity Framework 核心的 .NET Core 3.0 应用程序在播种数据库时冻结,没有抛出异常

ASP .NET Core 3.0 App with Entity Framework Core freezes while seeding DB with no exception thrown

从昨天开始,我 运行 我的数据库播种方法遇到了一个奇怪的问题,我似乎无法弄清楚。

我创建了一个 class 来播种我的数据库,为 DI 注册它并从 Startup.Configure 调用它的播种方法。在内部,我确保创建了数据库,然后我生成数据来填充它。添加前几组数据就可以了。但是在某些时候我需要向 table (200 行)添加稍微多一点的数据。

我创建了一个列表来存储条目并通过调用 await _context.AddRange(List) 然后调用 await _context.SaveChangesAsync() 继续添加它们。保存时执行冻结。其他任务,例如我注册的后台任务,仍在 运行ning 中。也没有抛出异常。如果我将两个执行更改为同步对应的执行,它将起作用。这使我认为我陷入了僵局。但是由于后台服务仍然 运行ning 并且我无法调试我的播种方法中发生的事情我不知道这是否会成为死锁。

我可以继续使用同步调用,但我觉得我在这里遗漏了一些东西并且可能会再次 运行 进入问题。最奇怪的部分是,我试图添加到 table 的数据仅在我添加更多列后才开始冻结执行。以前我在所有行上都调用了 await _context.Add(data),最后只调用了 await _context.SaveChangesAsync()。那时 table 有大约 15 列。当我将 table 扩展为 30 列时,这些和上述调用不再起作用。对我来说唯一的线索可能是必须添加的数据量增加,这使得 运行 更有可能陷入僵局,但除此之外我没有想法。

I created a class to seed my DB, registered it for DI and call its seeding method from Startup.Configure.

你不应该 运行 在 Startup.Configure 中设置任何东西,更不用说异步的东西了。如果您需要在应用程序启动时 运行 执行某些操作,请在您的 Program.Main 中进行,因为这是异步的,您需要切换到使用异步 Main:

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var seed = host.Services.GetRequiredService<SeedClass>();
    await seed.SeedAsync();

    await host.RunAsync();
}

也就是说,无论如何,这不是您应该使用 EF 播种的方式。自 EF 2.1 起,您通过 HasDataOnModelCreating:

中播种
modelBuilder.Entity<Blog>().HasData(new Blog {BlogId = 1, Url = "http://sample.com"});

有关详细信息,请参阅 docs