实体框架内存泄漏倍数插入

时间:2014-05-05 13:02:25

标签: c# entity-framework memory-leaks

我在数据库第一模式(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并且内存问题已经解决,但我的速度急剧下降。任何想法?

1 个答案:

答案 0 :(得分:2)

实体框架缺乏适用于批量操作的开箱即用方法,包括批量插入。它的代理机制虽然对延迟加载和更改跟踪都很有用,但会阻碍批量操作。

AFAIK这不是内存泄漏,它只是EF的常规行为,以及在迭代绑定到上下文的实体时创建的所有代理,上下文和更多内容。

GC将最终收集所有这些内容,但GC不会同步运行,也不会以任何优先级运行,因为您可能已经找到原因:性能受到影响。

根据之前的经验,我发现,有时,最好只删除ORM并编写普通的旧SQL命令,特别是批量插入。

无论如何,这里有一些可能对你有帮助的有趣链接。最后一个(尽管我从来没有使用它)似乎很有趣: