在线程之间共享DbContext

时间:2019-01-03 14:18:02

标签: c# asp.net entity-framework

我们在asp.net mvc应用程序(C#/ VS 2k15)上使用“通过请求一个数据库连接”模式。 基本上,我们在BeginRequest上创建一个DbContext,在EndRequest上创建Dispose()。

我曾经将这个DbContext保存在HttpContext上,但是遇到了一个稍微复杂的场景,我们需要运行多个线程,并且由于HttpContext在线程之间不共享,因此该解决方案停止工作。

首先我想使用CallContext,但是它的对象应该是可序列化的,而不是DbContext。

我想到的(非可选)解决方案是将DbContexts保存在公共静态词典中,其中的键(长)是线程ID,但我认为有更好的解决方案。

在线程之间共享DbContext的最佳解决方案是什么?

谢谢。

2 个答案:

答案 0 :(得分:6)

  

在线程之间共享DbContext的最佳解决方案是什么?

不这样做。一个DbContext实例不能被多个线程同时访问。

只需让您的后台进程在using块中创建一个新的DbContext。基础数据库连接已池化,将被重用。

如果您只想跨单个HTTP请求发出的Task传递DbContext实例,并且可以保证两个并发Task或Thread不会访问它,则可以使用AsyncLocal。 / p>

您还可以capture引用DbContext的局部变量,并将其显式传递给您等待的任务。 EG

await Task.Run(() =>
  {
    var e = db.MyEntity.First();
    //. . . 
   });

答案 1 :(得分:0)

我建议不要这样做。

但是,如果您坚持使用它并且正在使用Inversion of Control库,那么它很可能会支持Per thread lifestyle