DbContext没有在Dispose()上获取Disposed

时间:2016-11-03 15:22:33

标签: c# entity-framework

如果我在调试模式下调用Dispose,为什么我的DbContext没有处理?

在发布模式下,一切正常,但在Debugmode中,我在循环的每次迭代中看到内存增加,永远不会释放。

我使用了工具 dotMemory 来确保它来自_db

如果我在_db = null;

之后写_db.Dispose();,它就有效

我有这个基类:

public abstract class SomeBase : IDisposable
{
    private MyDbContext _db;

    public abstract void Process();

    protected KassenautomatEntities Db
    {
        get { return _db ?? (_db = new MyDbContext); }
    }

    public void Dispose()
    {
        if (_db != null)
        {
            _db.Dispose();
            _db = null; //Without this, theContext does not get Disposed in Debug Mode
        }
    }
}

然后我使用以下方法获取从SomeBase继承的所有类的实例:

public static IEnumerable<T> EnumeratedObjectsOfType<T>(params object[] constructorArgs) where T : class
{
    return EnumerateTypesOfType<T>().Select(type => (T) Activator.CreateInstance(type, constructorArgs));
}

public static IEnumerable<Type> EnumerateTypesOfType<T>() where T : class
{
    return Assembly.GetAssembly(typeof(T))
        .GetTypes()
        .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(T)));
}

并循环处理:

private static void Main()
{
    var someArray= ReflectionUtility.EnumeratedObjectsOfType<SomeBase>().ToArray();
    for (var i = 0; i < someArray.Length; i++)
    {
        someArray[i].Process();
        someArray[i].Dispose();
        someArray[i] = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

    Console.ReadKey();
}

那么,为什么我需要将'_db'设置为null? someArray[i] = null;上不应该自动丢失参考文献吗?

0 个答案:

没有答案