EF Core上下文未处理变更跟踪实体

时间:2019-08-20 17:08:40

标签: c# entity-framework asp.net-core .net-core entity-framework-core

使用EF Core 2.1插入135k记录。请求完成后,我希望可以处理上下文并与之一起清除ChangeTracking实体,但是,它保留所有135k记录并在此过程中使用大量内存。

我们正在使用ASP.NET Core 2.1,并从DI容器注入EF上下文。由于DI容器应在请求结束时处理范围内的上下文,因此它不应保留这些值。甚至在控制器末端手动调用dispose似乎也不会影响更改跟踪实体。

以下是请求完成后内存使用情况的堆视图的输出。深入探讨这条路,我看到了很多EF Core类,并且奇怪地看到了一个EntityQueryable实例,用于另一个实体(SystemInvoicePendingItem)。

Heap


上下文正在Startup.cs中注册:

services.AddDbContext<EFContext>(options => options.UseMySql(
  GetDBConnectionString()
));

2 个答案:

答案 0 :(得分:0)

似乎是关于以下问题: How should I manage DbContext Lifetime in MVC Core?

对于更改跟踪,默认情况下已启用它,并且在处置上下文时将其删除。但是,您也可以通过将DbContext的AutoDetectChangesEnabled属性设置为false来禁用更改跟踪。

context.Configuration.AutoDetectChangesEnabled = false;

此外,当插入+ 100k项时,出于性能和内存方面的原因,应分批执行,例如2k。

答案 1 :(得分:-2)

您可以在类中正确实现IDispose接口,并管理在不再使用该类时如何销毁该类,实现该接口并使用Dispose Pattern。

enter image description here

请参阅以下文档:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose