最好调用上下文.只保存更改一次



我是EF的新手,我正在将Windows服务应用程序转换为使用EF。它将读取一个包含11000名员工的文本文件,查看记录是否存在,然后插入或更新。

目前,我正在循环遍历每一行,创建一个带有值的新实体对象,将其传递给一个数据类,然后它会在其中查找实体,看看它是否会插入或更新。问题是我在调用上下文。SaveChanges()每个记录。

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

只是在寻找一种快速的方法。

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();
    }     
}

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

为什么速度慢

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

因此,如果你有11k条记录,你的两个解决方案都将使22k数据库往返,这太疯狂了。

免责声明:我是项目实体框架扩展的所有者

如果您真的在寻找更快的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 });
}  

最新更新