ModelBuilder是线程安全的吗?

时间:2019-04-03 06:55:57

标签: c# ef-core-2.2

这实际上不是问题,而是更多的问题,但是由于我在互联网和您选择的强大搜索引擎上找不到任何帮助,因此我想在这里提出问题。

我知道,按照设计,EF Core并不是线程安全的。我完全理解了DbContext实例的隔离点,但是我想知道为什么模型构建似乎已经受到了影响。

背景

为了加快应用程序的启动时间,我想使用2个不同的DbContext并行执行2个查询。基本上,它们每个都反映了我域中的“绑定上下文数据库”,一个映射到数据库中的环境设置(用户设置,存储的UI布局,...),一个映射到系统设置(系统密码,...)。

因此,当我启动应用程序时,我想启动两项任务,一项进入环境设置以获取已经存在的布局内容和用户设置,另一项进入系统设置以检查正确的密码等。< / p>

问题

两个任务都将自己创建基础DbContext,因此DbContext是在该线程上创建的。但是,似乎以某种方式,在EF Core的幕后,实际的模型构建是不同的,还是“每个”线程或“每个DbContext”完成的。

执行我的应用程序时,它有时会因以下错误而崩溃:

System.InvalidOperationException: Cannot create a DbSet for 'EvaluationSettings' because this type is not included in the model for the context.

但是,查看我的日志后发现,该实体先前是在上下文中注册的。

  • 线程18用于系统,并在其上下文中注册SystemInformation和Variable并调用“ EnsureCreated”
  • 线程16用于获取区域性设置等,并在上下文中注册评估,评估设置...,并调用“ EnsureCreated”

此后,线程16(从EvaluationSettings实体获取系统区域性)失败。

image

当我调试该问题并尝试获取模型构建器的见解时,我发现DbContext模型构建器仅知道评估类型。其余的都消失了。

image

问题

是不是因为3个线程并行调用“ EnsureCreated”,所以只有那些实体在上下文中获得了在那个时间点注册的模型? 在那个级别上,似乎没有隔离“这个模型属于那个上下文”,对吧?

有人对此有可能解决的办法吗? 或提出解决方案的建议?

版本

EF Core 2.2.1

GitHub问题

https://github.com/aspnet/EntityFrameworkCore/issues/15243

0 个答案:

没有答案