由于应用程序尝试访问数据库,导致使用EF工具时出现问题

时间:2019-05-17 01:50:52

标签: asp.net-core entity-framework-core

我有一个使用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工具正在调用我,并避免启动辅助线程。

对于最合适的策略和实现它的最佳方法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

EF Core工具使用不同的策略来创建派生的DbContext,如文档的Design-time DbContext Creation部分所述。

看起来您当前正在使用From application services。但是根据问题的解释,最适合您的情况似乎是From a design-time factory

  

您还可以通过实现IDesignTimeDbContextFactory<TContext>接口来告诉工具如何创​​建DbContext:如果在与派生的DbContext相同的项目中或在应用程序的启动中找到实现此接口的类在项目中,这些工具会绕过创建DbContext的其他方法,而改用设计时工厂。