使用它完成任何查询后,如何自动处置ContextDB类

时间:2018-10-22 14:06:18

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

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事件不合适,因为并非所有查询都在更新或插入。

1 个答案:

答案 0 :(得分:0)

我可以使用以下解决方案。

  1. 在Global.asax中 开始请求:创建dbContext的实例。将其存储在HttpContext.Current.Items中。

    结束请求:获取上下文并关闭/释放连接。

  2. 另一个更好的解决方案是使用DI。依赖注入并限制实例的范围。有很多方式,例如Singleton,PerRequest等。