在线程之间共享DbContext

Jeo*_*ida -1 c# asp.net entity-framework

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

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

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

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

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

谢谢.

Dav*_*oft 6

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

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

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

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

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

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