使用Entity Framework的System.OutOfMemoryException?

Kap*_*ija 9 entity-framework entity-framework-4.1

我正在尝试使用Entity框架保存数十万条记录.保存几十万条记录后,我得到以下错误:

:为System.OutOfMemoryException

我的代码

  foreach (BibContent objbibcontents in lstBibContent)
        {
            db.BibContents.AddObject(objbibcontents);
            c = c + 1;
            if (c == 1000)
            {
                db.SaveChanges();
                c = 0;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我注意到在保存了1000条记录后,我的数据库没有覆盖另外1000条记录.它将它们添加到我的dbcontext中.

我在1000条记录后创建了一个新实例,但我的数据库仍然具有上一个对象的数据.看我的代码

   foreach (var objbibcontents in lstBibContent)
            {
                vibrantEntities db1 = new vibrantEntities(szConStr);
                lstBibCon.Add(objbibcontents);
                // db.BibContents.AddObject(objbibcontents);
                c = c + 1;
                if (c == 1000)
                {
                    foreach (BibContent bibobject in lstBibCon)
                    {
                        db1.BibContents.AddObject(bibobject);
                    }
                    lstBibCon.Clear();
                    db1.SaveChanges();
                    c = 0;
                    flag = 1;
                }
            }
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 12

您要保存多少个对象以及单个对象有多大?DbContext保存对您通过AddObject调用添加的所有对象的引用.调用SaveChanges不会清除其内部数据结构,因此如果为1M对象调用代码,则内存中将包含1M对象,并且它们将完全处于活动状态,因为它们的GC根对象将是仍在运行代码范围内的上下文实例.

如果要避免内存问题,则应为每1000条记录(甚至每条记录)使用一个新的上下文实例.运行SaveChanges1000条记录和单条记录之间的唯一区别是自动涉及的事务.