繁体   English   中英

当我在 EF Core 中执行 ToList() 时,是否释放了 DbContext

[英]Is the DbContext disposed when I do a ToList() in EF Core

我读到,对于EF Core ,没有义务使用带有DBContext的 using 语句来处理它(或直接调用 de Dispose 方法)。 垃圾收集器会这样做。 我还读到,当您阅读检索到的对象时,它们也应该处理掉,但我不确定我是否理解正确。 这是否意味着如果我对 DbContext 的集合返回执行toList() ,我的上下文将在此时被处理掉? 我很难在谷歌上找到这个特定的答案。

Entity Framework 的资源管理不能以这种方式工作。 实体框架显式定义了实例创建时的生命周期,直到实例被处置。 在开发框架时,基本目的是存在于单个工作单元中,这就是为什么它非常适合 Web 应用程序,它可以在其他地方使用——但基本用途适合。

您如何配置和确定服务范围将定义实例的生命周期。 但它应遵守以下原则:

典型的工作单元将涉及创建实例、跟踪在上下文中定义的实体实例、从查询返回、添加或附加到上下文、对跟踪的实体进行更改。 然后保存所做的更改并将它们写入数据库。 然后处置实例。

因此,如果您利用以下服务:

public class CustomerAccountService : ICustomerAccountService
{
     private bool disposed = false;
     private readonly ICustomerRepository repository;

     public CustomerAccountService(ICustomerRepository repository) => this.repository = repository;

    // Additional logic would go here, including the implementation of the repository which will hold our DbContext.
}

CustomerAccountService不再限定范围时,它将开始清理处置和清理实体框架实例,因为一旦服务的生命周期已过期。 请记住,依赖注入容器和您的配置将影响它的影响方式。 如果可以,您应该始终添加正确重新分配这些资源的IDispose

该文档明确指出:

使用后处理 DbContext 非常重要。 这可以确保释放任何非托管资源,并确保取消注册任何事件或其他挂钩,以防止在实例保持引用的情况下发生内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM