c# - Entity Framework (EF) OutOfMemoryException

标签 c# .net entity-framework entity-framework-4 out-of-memory

我有 > 67000 条记录从其他来源进入我的系统。在对这些记录应用业务规则后,我必须将它们存储到数据库中。我使用以下代码来执行此操作:

        using (var context = new MyEntities())
        {
            var importDataInfo = context.ImportDataInfoes.First(x => x.ID == importId);

            importedRecords.ForEach(importDataInfo.ValuationEventFulls.Add);

            context.SaveChanges();
        }

执行代码后出现以下错误(OutOfMemoryException)

    Error in executing code|Exception of type 'System.OutOfMemoryException' was thrown.*   at System.Data.Mapping.Update.Internal.KeyManager.<WalkGraph>d__5.MoveNext()
   at System.Data.Mapping.Update.Internal.KeyManager.GetPrincipalValue(PropagatorResult result)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.GenerateValueExpression(EdmProperty property, PropagatorResult value)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding target, PropagatorResult row, PropagatorResult originalRow, TableChangeProcessor processor, Boolean insertMode, Dictionary`2& outputIdentifiers, DbExpression& returning, Boolean& rowMustBeTouched)
   at System.Data.Mapping.Update.Internal.UpdateCompiler.BuildInsertCommand(PropagatorResult newRow, TableChangeProcessor processor)
   at System.Data.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode, UpdateCompiler compiler)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.<ProduceDynamicCommands>d__0.MoveNext()
   at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
   at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable`1 commands, UpdateTranslator translator)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)

我正在使用 EF 4.0。

我的问题是保存记录的数量有限制吗?保存大量记录的最佳做法是什么(将它们保存在 block 中?事务呢?)。

先谢谢大家。

最佳答案

您可能希望一次将大约 1024 条记录成批发送该数据。

您可以包装在事务中对记录进行批处理的循环,这样您就可以根据需要回滚整个序列。请注意,此事务很可能会升级为分布式事务。

分布式事务只能应用于运行 Microsoft 分布式事务协调器 (MS-DTC) 服务的服务器。处理分布式事务时会出现显着的性能损失。

关于c# - Entity Framework (EF) OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5980769/

相关文章:

c# - 带有 XML 文件的 Entity Framework

asp.net - Entity Framework asp.net 应用程序中的 UOW 和存储库

entity-framework - EntityFramework 使用值 "00000000-0000-0000-0000-000000000000"填充唯一标识符

c# - 如何创建与当前视觉风格相匹配的颜色?

c# - 尝试加载格式错误的程序 ERROR

c# - DataGridView.AutoResizeColumns 忽略列标题高度

c# - C# 的 Lint

linq - "group by"在 LINQ 中如何工作?错误 "' 对象'不包含 'type' 的定义“

c# - 从流创建 Zip 文件并下载

c# - 动态对象转换的语法替代方法