c# - EF SaveChanges 优化?

标签 c# entity-framework

为什么 DbContext ctx 在每次 SaveChanges() 执行后处理得更快?

第一个样本:

var ctx = new DomainContext(); 
foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
        }

ctx.Dispose();

第二个样本:

foreach (var item in deals)
        {
            DealsOfReutersAddition newDealAddition =
                        new DealsOfReutersAddition
                        {
                            DealsOfReutersId = item.DealsOfReutersId,
                            DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                        };
            var ctx = new DomainContext(); 
            ctx.DealsOfReutersAdditions.Add(newDealAddition);
            ctx.SaveChanges();
            ctx.Dispose();
        }

在 1000 行中,第二个样本估计为 8 秒,而第一个样本为 140 秒。 有什么方法可以清理 ctx 而不是重新创建?

最佳答案

根据@JensKloster 在评论中所说的内容,您绝对不想在循环中每次都调用 SaveChanges。但我实际上会抵制将其置于循环之外的诱惑。随着上下文跟踪的对象数量越来越多,内存将被用完,这将使增量保存变得缓慢。

那么,我的解决方案是在循环中设置一个运行计数器来确定何时进行保存:

int numberOfRecords = 0;
using(var ctx = new DomainContext())
{
  foreach (var item in deals)
          {
              DealsOfReutersAddition newDealAddition =
                          new DealsOfReutersAddition
                          {
                              DealsOfReutersId = item.DealsOfReutersId,
                              DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
                          };

              ctx.DealsOfReutersAdditions.Add(newDealAddition);

              numberOfRecords++;
              if(numberOfRecords % 500 == 0) //Saves after every 500 rows.
              {
                ctx.SaveChanges();
              }
           }
}

关于c# - EF SaveChanges 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409933/

相关文章:

c# - Entity Framework Core 中的一对一关系

sql - Entity Framework 4 Code First 出现数据库使用错误

c# - 如何使用 AVCaptureVideoDataOutput 避免 AVCaptureSession 中的丢帧

c# - 覆盖基类的实现,使得从继承的基类函数调用也调用被覆盖的函数

c# - LINQ 数据过滤仅在调试期间有效

c# - 在 Unity 中运行时设置法线贴图

c# - 自定义控件 - 首先绘制 OK,第二个不

entity-framework - Linq to SQL 自联接,其中联接的右侧部分被过滤

c# - 外键组件 'X' 不是类型 'Y' 的声明属性。验证它没有被明确排除

c# - 此 EF 查询中有多少个数据库调用?