我在数据库第一模式(SQL Server 208 R2)中使用EF 6进行了简单的实现。该测试的主要目的是查看系统是否存在使用EF的内存问题。 在创建模型之后,我使用EF 6.x EntityObjecct Generator来创建对象。数据库非常简单:您创建公司和用户,然后在公司中添加用户。我创建了1000个公司和10000个用户,之后我使用以下代码将所有用户添加到所有公司:
var query = (from x in db.ACCESS_USER
select x).ToList();
var query1 = (from y in db.COMPANY
select y).ToList();
foreach (var item in query1)
{
foreach (var user in query)
{
ACCESS_USERSINCOMPANY acComp = new ACCESS_USERSINCOMPANY();
acComp.COMPANYID = item.COMPANYID;
acComp.USERID = user.USERID;
acComp.CREATE_DATE = DateTime.Now;
db.AddToACCESS_USERSINCOMPANY(acComp);
db.SaveChanges();
}
}
当我运行此代码时,内存开始增长,大约2分钟后,我的计算机内存不足。我做了一个测试手动运行de GC并且内存问题已经解决,但我的速度急剧下降。任何想法?
答案 0 :(得分:2)
实体框架缺乏适用于批量操作的开箱即用方法,包括批量插入。它的代理机制虽然对延迟加载和更改跟踪都很有用,但会阻碍批量操作。
AFAIK这不是内存泄漏,它只是EF的常规行为,以及在迭代绑定到上下文的实体时创建的所有代理,上下文和更多内容。
GC将最终收集所有这些内容,但GC不会同步运行,也不会以任何优先级运行,因为您可能已经找到原因:性能受到影响。根据之前的经验,我发现,有时,最好只删除ORM并编写普通的旧SQL命令,特别是批量插入。
无论如何,这里有一些可能对你有帮助的有趣链接。最后一个(尽管我从来没有使用它)似乎很有趣: