我正在使用.NET 5.0开发一个ASP.NET项目;在这个项目中,我使用Entity Framework,code first,并配合一个Sql Lite文件数据库。
在startup.cs
文件中,我使用以下代码来以编程方式创建和更新数据库模式:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext dataContext)
{
// migrate any database changes on startup (includes initial db creation)
dataContext.Database.Migrate();
...
}
然后我有一个服务,用于清理数据库中某些表的旧数据。 它在启动时和定期地清理它们:
public class TimedDbCleanerService : IHostedService, IDisposable
{
...
}
有了这些功能:
public Task StartAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromHours(_dbCleanerSettings.Hours));
return Task.CompletedTask;
}
private void DoWork(object state)
{
// create scoped dbcontext
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<DataContext>();
// check and remove stuff
dbContext.SaveChanges();
}
}
在startup.cs
中使用以下代码进行注册:
services.AddHostedService<TimedDbCleanerService>();
这里的问题是,如果在执行项目之前数据库文件不存在,清理服务会尝试访问尚不存在的数据库表。
使用调试器,我可以看到在服务访问数据库之前调用了Database.Migrate()
,但迁移似乎是一个异步任务,需要一些时间才能完成。
有没有办法在创建和启动清理服务之前等待迁移完全执行其工作?