在线程之间共享DbContext

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (205)

我们在asp.net mvc应用程序(C#/ VS 2k15)上使用“按请求一个dbconnection”模式。基本上我们在BeginRequest上创建一个DbContext,在EndRequest上创建Dispose()它。

我曾经在HttpContext上保存这个DbContext但是我们遇到了一个更复杂的场景,我们需要运行多个线程并且这个解决方案停止工作,因为HttpContext没有在线程之间共享。

首先我想使用CallContext但它的对象应该是Serializable,而不是DbContext的情况。

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

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

谢谢。

提问于
用户回答回答于

我建议不要这样做。

但是,如果你坚持它并且你正在使用Inversion of Control库,它很可能会支持Per thread的方式

用户回答回答于

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

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

让你的后台进程在一个using块中创建一个新的DbContext 。底层数据库连接被池化并将被重用。

如果您只想在来自单个http请求的任务之间传递DbContext实例,并且可以保证它不会被两个并发的任务或线程访问,那么您可以使用AsyncLocal。

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

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励