ASP.NET控制器+实体框架Context =线程安全吗?

时间:2017-05-18 21:50:37

标签: c# asp.net-mvc multithreading entity-framework

所有

我正在编写看起来像的代码:

public class UserController : AuthenticatedController
{

    private MunicipalContext db = new MunicipalContext();

    // GET: Users/Edit/5
    public ActionResult Edit(int? id)
    {
        //Do stuff with db.Users
    }

    // Other action methods that do stuff with db.Users
}

来自Java背景,这感觉就像Servlets和实例字段,并开始在我的脑后引起嗡嗡的感觉。

我是否会遇到线程安全问题?

2 个答案:

答案 0 :(得分:5)

每个控制器将根据请求创建一次,它们不是单例。线程之间没有共享实例成员。

所以答案是肯定的,每次针对file1.dat的操作的新请求成为新的UserController和新的UserController时,您的代码都不存在线程问题是创造的。

附注:记得不再使用时MunicipalContext Dispose()个实例。更多信息here

答案 1 :(得分:1)

您没有任何线程安全问题,但通常您会使用与ASP.NET MVC略有不同的模式,其中使用IoC将上下文注入控制器以实现每个请求的上下文模式< / p>

如果您的控制器消耗了一些同样正在进行数据库访问的服务,则会出现问题 - 如果您不在它们之间共享上下文,则可能会出现一些奇怪和/或不正确的行为。

然后,IoC容器可以在处理请求后对上下文执行dispose;你如何实际做到这一点取决于你是使用传统的ASP.NET(通过HttpModule)还是Owin(中间件组件)