在基类中保护静态

时间:2013-04-29 19:16:39

标签: c# asp.net-mvc

我刚刚继承了一个ASP.NET MVC4应用程序,该应用程序具有一个具有以下成员的基类:

protected static DBMainDataContext m_dataContext = new DBMainDataContext();

此基类由另外两个使用LINQ从数据库中读取数据的类继承。这个基类具有静态数据上下文的事实,这是否会造成问题?我们似乎在无法访问DataReader的行中遇到错误,因为它已经打开了。这可能是原因吗?如果是,应该如何宣布?我只是删除静态关键字吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

是的,删除static关键字是可行的方法。

如果这是LINQ to SQL或Entity Framework Context,那么对象构建成本应该非常低,因此您应该为每个请求使用新实例。

您可能还应该验证DataReader是否已正确关闭(如ryrich建议的那样)。确保这一点的最佳方法是将它们的用法包装在一个使用块中:

using( var reader = ... )
{
    // code to use the reader here
}

答案 1 :(得分:0)

一般规则是静态成员应该是线程安全的。因此,您的静态m_dataContext应该是线程安全的。

DBMainDataContext不是线程安全的。因此,如果两个线程(两个ASP.NET请求)访问数据上下文,则它由两个线程同时修改。这将导致冲突。

所以你有两个选择:

  1. 删除static,每个帖子都有一个数据上下文。
  2. 通过锁定所有使用它的呼叫来同步对数据上下文的访问。