C# 实体框架太慢/内存泄漏
我在EntityFramework上做了很多工作,比如数百万次插入和更新。C# 实体框架太慢/内存泄漏,c#,performance,entity-framework,C#,Performance,Entity Framework,我在EntityFramework上做了很多工作,比如数百万次插入和更新。 然而,随着时间的推移,它变得越来越慢 我试着用一些方法来提高性能。比如: db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; 我也尝试过: db.Table.AsNoTracking(); 当我改变所有这些事情时,它真的变得更快了。然而,使用的内存开始增加,直到它给我异常
然而,随着时间的推移,它变得越来越慢 我试着用一些方法来提高性能。比如:
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
我也尝试过:
db.Table.AsNoTracking();
当我改变所有这些事情时,它真的变得更快了。然而,使用的内存开始增加,直到它给我异常
有人遇到过这种情况吗?
如果您只进行插入和更新,请多谢-尝试使用db.Database.SqlQuery(queryString,object) 实体框架在内存中保留所有连接的对象。因此,拥有数以百万计的内存可能会导致内存泄漏。提供了一个干净的界面,可以更快地进行批量更新和删除。我认为它只适用于SQL Server,但它可能会为您的性能问题提供一个快速的解决方案 可以按如下方式进行更新:
context.Users.Where(u => u.FirstName == "Firstname").Delete();
可以采用类似的方式进行删除:
context.Tasks.Where(t => t.StatusId == 1).Update(t => new Task { StatusId = 2 });
DbContext
存储您获取或添加到DbSet
的所有实体。正如其他人所建议的,您需要在每组操作(一组密切相关的操作,例如web请求)之后处理上下文,并创建一个新的上下文
例如,在插入数百万个实体的情况下,这可能意味着每1000个实体创建一个新的上下文。为您提供有关插入数千个实体所需的所有信息。数百万次插入和更新,所有内容都是在内存中提供的,我已经全部尝试过了。
只有当我停止使用上下文并使用ADO或另一种类似Dapper的Micro-ORM时,我才工作。您是否在大量操作中保持
DbContext
派生类型的单个实例处于活动状态?是的,有一个实例..我尝试过重新加载DbContext和Diposing..您通常应该使用单个实例每个“操作”的上下文。例如获取用户详细信息、方便登录等。您保留单个上下文有什么原因吗?我尝试过处理,然后他们重新创建它。但是它仍然给我内存不足这无助于插入或更新值-它只能从查询中更新。其思想是,使用查询进行更新要比使用相同的上下文在一个命令中加载、更改、持久化要快得多。谢谢您的回答。我尝试使用Dispose()并按照您的建议创建了一个新的。几乎从未录制过,但它仍然给出了一个例外。