使用EF Core 2.1插入135k记录。请求完成后,我希望可以处理上下文并与之一起清除ChangeTracking
实体,但是,它保留所有135k记录并在此过程中使用大量内存。
我们正在使用ASP.NET Core 2.1,并从DI容器注入EF上下文。由于DI容器应在请求结束时处理范围内的上下文,因此它不应保留这些值。甚至在控制器末端手动调用dispose似乎也不会影响更改跟踪实体。
以下是请求完成后内存使用情况的堆视图的输出。深入探讨这条路,我看到了很多EF Core类,并且奇怪地看到了一个EntityQueryable
实例,用于另一个实体(System
与InvoicePendingItem
)。
上下文正在Startup.cs
中注册:
services.AddDbContext<EFContext>(options => options.UseMySql(
GetDBConnectionString()
));
答案 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。
请参阅以下文档:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose