这实际上不是问题,而是更多的问题,但是由于我在互联网和您选择的强大搜索引擎上找不到任何帮助,因此我想在这里提出问题。
我知道,按照设计,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.
但是,查看我的日志后发现,该实体先前是在上下文中注册的。
此后,线程16(从EvaluationSettings实体获取系统区域性)失败。
当我调试该问题并尝试获取模型构建器的见解时,我发现DbContext模型构建器仅知道评估类型。其余的都消失了。
是不是因为3个线程并行调用“ EnsureCreated”,所以只有那些实体在上下文中获得了在那个时间点注册的模型? 在那个级别上,似乎没有隔离“这个模型属于那个上下文”,对吧?
有人对此有可能解决的办法吗? 或提出解决方案的建议?
EF Core 2.2.1