我遇到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非常脏。
亲切的问候 马克