EF6.1 DbContext内存泄漏

时间:2014-12-24 08:44:35

标签: c# entity-framework memory memory-leaks

我遇到EF6.1和DbContext的问题, 我有一个非常简单的类,作为UserSettings / ApplicationSettings的数据库存储。 因此,在每次设置重新加载时,我的记忆都会成长。但是当我从DB中注释掉getItem时,没有内存增长。

private SettingItem GetSettingItem(SettingsDbContext context, String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId)
    {
        IQueryable<SettingItem> items = (from t in context.SettingItem.AsNoTracking()
                                         where t.Enabled
                                         where t.ApplicationName == appName
                                         where t.Section == section
                                         where t.SettingScope == scope
                                         where t.Name == name
                                         where (t.Host == null && host == null) || t.Host == host
                                         where (!t.UserId.HasValue && !userId.HasValue) || t.UserId == userId
                                         where (!t.TenantId.HasValue && !tenantId.HasValue) || t.TenantId == tenantId
                                         select t);

        //return context.SettingItem.FirstOrDefault();
           return items.FirstOrDefault();
    }




    public Object GetSetting(String appName, String section, Byte scope, String name, String host, Int32? userId, Int32? tenantId = null)
    {
        using (SettingsDbContext context = new SettingsDbContext(ConnString))
        {
            SettingItem item = GetSettingItem(context, appName, section, scope, name, host, userId, tenantId);

            if (item == null)
                return null;

            if (item.BinValue != null)
                return item.BinValue.ToArray();

            if (item.StringValue != null)
                return item.StringValue;

            return null;
        }
    }

所以我做了很多测试, GetSettingItem返回null。没有内存泄漏 返回新的SettingItem,没有内存泄漏, 返回context.SettingItem.FirstOrDefault(),泄漏有点低/慢 作为Lambda的声明是相同的结果。

我不知道本声明中的问题在哪里。

对于每个已加载的设置,方法已执行一次。 在单独的测试中,我已经使用Ado.Net获取了SettingItem,现在增加的内存非常慢(100次执行中100kb)。因此,Main Leak不在SettingsProvider中,而是在DbContext中。

让某人有想法来修复它,因为在EF环境中使用Ado.Net非常脏。

亲切的问候 马克

0 个答案:

没有答案