我刚刚继承了一个ASP.NET MVC4应用程序,该应用程序具有一个具有以下成员的基类:
protected static DBMainDataContext m_dataContext = new DBMainDataContext();
此基类由另外两个使用LINQ从数据库中读取数据的类继承。这个基类具有静态数据上下文的事实,这是否会造成问题?我们似乎在无法访问DataReader的行中遇到错误,因为它已经打开了。这可能是原因吗?如果是,应该如何宣布?我只是删除静态关键字吗?
谢谢!
答案 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请求)访问数据上下文,则它由两个线程同时修改。这将导致冲突。
所以你有两个选择:
static
,每个帖子都有一个数据上下文。