Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架太慢/内存泄漏_C#_Performance_Entity Framework - Fatal编程技术网

C# 实体框架太慢/内存泄漏

C# 实体框架太慢/内存泄漏,c#,performance,entity-framework,C#,Performance,Entity Framework,我在EntityFramework上做了很多工作,比如数百万次插入和更新。 然而,随着时间的推移,它变得越来越慢 我试着用一些方法来提高性能。比如: db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; 我也尝试过: db.Table.AsNoTracking(); 当我改变所有这些事情时,它真的变得更快了。然而,使用的内存开始增加,直到它给我异常

我在EntityFramework上做了很多工作,比如数百万次插入和更新。
然而,随着时间的推移,它变得越来越慢

我试着用一些方法来提高性能。比如:

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()并按照您的建议创建了一个新的。几乎从未录制过,但它仍然给出了一个例外。