entity-framework - Entity Framework 性能问题,saveChanges非常慢

标签 entity-framework

最近,我正在做一些简单的EF工作。非常简单,
第一,

List<Book> books = entity.Books.WHERE(c=>c.processed==false)ToList();  
then  
    foreach(var book in books)  
    {  
      //DoSomelogic, update some properties,   
    book.ISBN = "ISBN " + randomNumber();  
    book.processed = true;  
    entity.saveChanges(book)  
    }  

我将entity.saveChanges放入foreach之内,因为它是一个很大的列表,大约有100k条记录,如果对该记录进行了正确处理,则标记该记录,并将book.processed = true设置为true,如果该进程被异常中断,则下次,我不必再次处理这些好的记录。

一切对我来说似乎还可以。处理数百条记录时速度很快。然后,当我们移至10​​万条记录时,entity.saveChanges非常慢。每条记录大约1-3秒。然后,我们保留实体模型,但将entity.saveChanges替换为经典SqlHelper.ExecuteNonQuery("update_book", sqlparams)。而且速度非常快。

谁能告诉我为什么 Entity Framework 流程这么慢?而且,如果我仍然想使用entity.saveChanges,那么提高性能的最佳方法是什么?

谢谢

最佳答案

在执行插入操作之前,请关闭更改跟踪。这将显着提高您的性能(数量级)。将SaveChanges()放入循环之外也将有所帮助,但是关闭更改跟踪将有更多帮助。

using (var context = new CustomerContext())
{
    context.Configuration.AutoDetectChangesEnabled = false;

    // A loop to add all your new entities

    context.SaveChanges();
}

有关更多信息,请参见this page

关于entity-framework - Entity Framework 性能问题,saveChanges非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21272763/

相关文章:

entity-framework - 添加和删​​除关联 - Entity Framework

c# - 测量许多方法的执行时间

c# - 使用 Linq to Entities 的“Contains()”解决方法?

c# - 如何使用 Entity Framework 将空值传递给存储过程?

asp.net-mvc - 在我的情况下使用扩展方法是否正确?

mysql - 如何在 visual studio 2015 中使用 ADO.net Identity 数据模型使用 Entity Framework 6(web api)进行 mariadb 设置(版本 10.2.17)?

c# - EF Core (3.1) 工具 : is there a way to downgrade a database to just the previous migration?

c# - 从 Entity Framework 中的数据库更新模型不起作用

c# - Entity Framework 数据集映射

c# - Entity Framework 5 MVC 4 - 脚手架错误 - 无键