【问题标题】:Would it be best to call context.SaveChanges only once?最好只调用一次 context.SaveChanges 吗?
【发布时间】:2016-03-24 20:18:55
【问题描述】:

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

【问题讨论】:

标签: entity-framework entity-framework-6


【解决方案1】:

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

为什么慢?

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

因此,如果您有 11k 条记录,那么您的两个解决方案都会进行 22k 数据库往返,这太疯狂了。

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

如果您真的在寻找更新插入记录的更快方法,这个库将显着提高您的性能 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 });
}  

【讨论】:

  • 当...你不知道吗,我正在开发一个看起来还不支持的 Oracle DB。明天回去工作后我会进行更多研究。
  • 你说得对,我们还不支持 Oracle。我们目前正在添加 PostgreSQL,然后在几周/几个月内我们将添加对 Oracle 的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多