最好只调用一次context.SaveChanges吗?

时间:2016-03-24 20:18:55

标签: entity-framework entity-framework-6

我是EF的新手,我将Windows服务应用转换为使用EF。它将读取一个包含11k名员工的文本文件,并查看是否存在记录,并进行插入或更新。

目前,我循环遍历每一行,使用值创建一个新的实体对象,将其传递给数据类,然后在那里查找实体以查看它是否会插入或更新。我正在调用context.SaveChanges()每个记录。

现在我想知道是否应该为所有员工创建一个实体列表。然后我将该列表发送到数据类,循环遍历列表,设置修改后的状态或附加,然后在我完成整个列表后执行SaveChanges。这会工作,它只会调用插入/更新一次,还是仍然会查询11k次所有记录?

只是寻找快速的方法来做到这一点。

foreach (string line in lines)
{
    if (line.Trim().Length > 0)
    {
        SAP_DATES dateRecord = new SAP_DATES();
        dateRecord.EMP = line.Substring(0, 8);
        dateRecord.DATE_TYPE = line.Substring(10, 20);
        dateRecord.DATE_VALUE = Convert.ToDateTime(line.Substring(30, 10));
        dateRecord.DATE_MODIFIED = Convert.ToDateTime(line.Substring(40, 10)); 

        Data.DataManager.ProcessDateRecord(dateRecord);     
    }
}

这是我的数据类

public static void ProcessDateRecord(SAP_DATES dateRecord)
{
    using (DataContext db = new DataContext())
    {
        var original = db.SAP_DATES.Find(dateRecord.EMP, dateRecord.DATE_TYPE);

        if (original != null)
        {
            db.Entry(original).CurrentValues.SetValues(dateRecord);                    
        }
        else
        {
            db.SAP_DATES.Add(dateRecord);
        }
        db.SaveChanges();
    }     
}

1 个答案:

答案 0 :(得分:1)

这两种技术都会非常慢,但每次X记录使用SaveChanges可能会稍微改善性能。

为什么慢?

  • Find方法为每条记录执行数据库往返
  • “添加”或“更新”为每条记录执行数据库往返

因此,如果您有11k记录,那么您的两个解决方案都将使22k数据库往返变得疯狂。

免责声明:我是该项目的所有者Entity Framework Extensions

如果您真的在寻找更快的Upsert记录方式,那么这个库可以将您的性能提高2000%甚至更多!

合并语句将更新现有记录并插入新记录。

using (DataContext db = new DataContext())
{
    // Using EF Key
    db.BulkMerge(list);

    // Using a Custom Key
    db.BulkMerge(list, ctx.BulkMerge(list, 
          operation => operation.ColumnPrimaryKeyExpression = date => 
                       new { date.EMP, date.DATE_TYPE });
}