我正在使用EntityFramework进行大量工作,例如数百万个插入和更新 然而,随着时间的推移,它变得越来越慢......
我尝试了一些提高性能的方法。像:
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
也试过了:
db.Table.AsNoTracking();
当我改变所有这些东西时,它真的变得更快。然而,使用的内存开始增加,直到它给我例外。
有没有人有这种情况? 感谢
答案 0 :(得分:2)
DbContext
存储您提取或添加到DbSet
的所有实体。正如其他人所建议的那样,您需要在每组操作(一组密切相关的操作 - 例如Web请求)之后处理上下文并创建一个新操作。
在插入数百万个实体的情况下,这可能意味着每1,000个实体创建一个新的上下文。 This answer为您提供了有关插入数千个实体的所有信息。
答案 1 :(得分:0)
如果您只进行插入和更新 - 请尝试使用db.Database.SqlQuery(queryString,object)。
实体框架在内存中保留所有附加对象。因此,拥有数百万可能会导致内存泄漏。
答案 2 :(得分:0)
https://github.com/loresoft/EntityFramework.Extended提供了一个干净的界面,可以更快地进行批量更新和删除。我认为它只适用于SQL Server,但它可以为您提供快速解决性能问题的方法。
更新可以这样做:
context.Users.Where(u => u.FirstName == "Firstname").Delete();
删除可以以类似的方式完成:
context.Tasks.Where(t => t.StatusId == 1).Update(t => new Task { StatusId = 2 });
答案 3 :(得分:0)
对于数百万的插入和更新,一切都没有记忆,我已经尝试了所有..
只有在我停止使用上下文并使用 ADO 或其他微型ORM(如 Dapper )时才能为我工作。