实体框架太慢/内存泄漏

时间:2015-08-13 14:51:59

标签: c# performance entity-framework

我正在使用EntityFramework进行大量工作,例如数百万个插入和更新 然而,随着时间的推移,它变得越来越慢......

我尝试了一些提高性能的方法。像:

db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;

也试过了:

db.Table.AsNoTracking();

当我改变所有这些东西时,它真的变得更快。然而,使用的内存开始增加,直到它给我例外。

有没有人有这种情况? 感谢

4 个答案:

答案 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 )时才能为我工作。