我有一个使用EF Core 2.2的ASP.NET Core 2.2应用程序。
我有一些后台工作线程,我从ConfigureServices()
开始。这些线程取决于DbContext和我在ConfigureServices()
中注册的其他服务。
我发现,当我尝试使用Add-Migration
时,EF工具会导致这些线程运行,这反过来会在Add-Migration
输出中引发异常,因为这些线程尝试访问执行以下操作的数据库对象:还不存在。
看来迁移已成功创建,但是,由于迁移似乎失败(输出异常,进程未退出等),因此使使用工具变得困难。
我看到一些避免这种情况的选择:-
a)在ConfigureServices()
中以某种方式检测到数据库与上下文不匹配(即“是最新的”)并采取相应的措施。
b)在我的应用程序由EF工具运行时不会被调用的其他地方启动我的工作线程。请记住,启动这些线程需要ServiceProvider
,其作用域与我在ConfigureServices()
中建立的作用域相同。
c)在我的应用中检测到EF工具正在调用我,并避免启动辅助线程。
对于最合适的策略和实现它的最佳方法,我将不胜感激。
答案 0 :(得分:1)
EF Core工具使用不同的策略来创建派生的DbContext
,如文档的Design-time DbContext Creation部分所述。
看起来您当前正在使用From application services。但是根据问题的解释,最适合您的情况似乎是From a design-time factory:
您还可以通过实现
IDesignTimeDbContextFactory<TContext>
接口来告诉工具如何创建DbContext:如果在与派生的DbContext
相同的项目中或在应用程序的启动中找到实现此接口的类在项目中,这些工具会绕过创建DbContext的其他方法,而改用设计时工厂。