ASP.NET MVC 5项目。
我知道使用EF上下文对象的最佳做法如下
using(var context = new ContextDB())
{
}
但是我正在处理一个大型现有项目,但没有使用这种做法。
使用以下模式进行项目
public abstract class BaseService
{
private static ContextDB _data { get; set; }
public static ContextDB Data
{
get
{
if (_data== null)
_data= new ContextDB();
return _data;
}
}
}
实际上,由于这种模式,我收到了exception(有时但并非总是如此)
因此,要解决此问题,我必须更改所有使用共享Data
的代码
属性并将其替换为我在问题开头提到的ContextDB
的新实例。
这是一个很大的修改,我将无法进行修改。
问题,是否可以在不更改大量代码的情况下解决此问题,换句话说,我可以仅通过在BaseService
类内部进行的修改来解决问题吗,例如,是否有任何事件可以知道是否执行了任何查询然后处理ContextDB
这是我脑海中的想法的伪代码
public abstract class BaseService
{
public static ContextDB Data
{
get
{
ContextDB _data= new ContextDB();
_data.SqlQueryExecuted += () => { this._data.dispose(); }
return _data;
}
}
}
注意:SaveChanged
事件不合适,因为并非所有查询都在更新或插入。
答案 0 :(得分:0)
我可以使用以下解决方案。
在Global.asax中 开始请求:创建dbContext的实例。将其存储在HttpContext.Current.Items中。
结束请求:获取上下文并关闭/释放连接。
另一个更好的解决方案是使用DI。依赖注入并限制实例的范围。有很多方式,例如Singleton,PerRequest等。