实体框架 + 多线程 + 延迟加载

9
我遇到了Entity Framework和多线程的问题,我想知道是否有一种方法可以保持延迟加载的能力来解决这个问题。据我所知,数据上下文是非线程安全的,因此当我使用相同的数据上下文时,会出现各种数据读取器错误。解决该问题的方法是为每个与数据库连接的连接使用单独的数据上下文,然后销毁数据上下文。不幸的是,销毁我的数据上下文会阻止我进行延迟加载。
是否有一种模式可以允许我在应用程序中共享上下文,但仍然正确处理多个线程?

当我们将Parallel.ForEach与EF延迟加载结合使用时,我们遇到了类似的问题。 - Tom Robinson
1个回答

10

不,目前没有这样的解决方案。在多线程应用程序中,您的选择为:

  • 每个线程上下文
  • 单个上下文生成未代理分离实体(无惰性加载、无更改跟踪),并使用同步来访问该上下文中的每个内容。

对于附有代理附加实体的第二种方法会导致灾难。它需要检测与上下文的所有隐藏交互,并使相关代码也同步。您最终可能会得到在多个切换线程中运行的单线程进程。


+1 是因为这是技术上正确的,但是:即使只有一个线程,在整个应用程序中共享一个上下文也是一个问题。上下文应该是一个工作单元并且短暂存在。 - Craig Stuntz
@Craig:没错。我不是指整个应用程序只有一个上下文实例,而是在单个“逻辑操作”上为多个线程提供一个上下文。如果实体必须被分离,我不确定它是否仍然是工作单元。 - Ladislav Mrnka
谢谢。这正是我预计的答案。 - ctrlalt313373
在第一种情况下,如果您想保存在另一个DbContext上创建的模型,会发生什么? - Hossein Shahdoost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接