我是不是需要手动关闭 EF 核心 Dbcontext 连接

Posted

技术标签:

【中文标题】我是不是需要手动关闭 EF 核心 Dbcontext 连接【英文标题】:Do I need to close EF core Dbcontext connection manually我是否需要手动关闭 EF 核心 Dbcontext 连接 【发布时间】:2021-08-17 02:57:59 【问题描述】:

我为我的 Web 应用程序使用了 EF 核心,并在那里初始化 dbcontext 我使用了构造函数依赖注入。

   private readonly ERPDB_GlobalContext _dbContext;
   public ProductCategoryController(ERPDB_GlobalContext dbContext)
   
       _dbContext = dbContext;
       
   

使用依赖注入后,我直接使用 _dbcontext 进行 CRUD 操作,而不使用 using 范围。所以我需要知道在我执行 CRUD 操作后不使用 using 范围连接是否会自动关闭。

这是我使用 dbcontext 而不使用范围来获取数据并将数据保存到数据库的两个示例

var category = _dbContext.ProductCategories.Where(c => c.CompanyId == cmp).ToList();

ProductCategories productCategory = new ProductCategories

    ProductCateId = Guid.NewGuid(),
    ProductCateName = model.ProductCateName,
    CompanyId = companyId,

 ;
 _dbContext.ProductCategories.Add(productCategory);
 _dbContext.SaveChanges();

我阅读了MSdoc和一些文章,发现dbcontext对象被销毁后dbcontext会自动关闭,否则连接不会手动打开(但对EF核心中手动打开的连接不太了解)

需要澄清的是在使用依赖注入的同时创建dbContext时必须使用使用范围

【问题讨论】:

查看DbContext Lifetime, Configuration, and Initialization 感谢@Genusatplay 阅读我找到了答案。 【参考方案1】:

DbContext 的生命周期从创建实例开始,到释放实例结束。 DbContext 实例旨在用于单个工作单元

使用 Entity Framework Core (EF Core) 时的典型工作单元包括:

    创建 DbContext 实例 通过上下文跟踪实体实例。实体被跟踪 经过 从查询中返回 被添加或附加到上下文中 根据需要对跟踪的实体进行更改以实施 业务规则 调用 SaveChanges 或 SaveChangesAsync。 EF Core 检测到 所做的更改并将其写入数据库。 DbContext 实例被释放

感谢@Genusatplay,此答案可在 Microsoft 文档中找到,如需进一步阅读,您可以参考 DbContext Lifetime, Configuration, and Initialization .在这个链接下你可以找到当我们使用依赖注入和没有依赖注入时dbcontext是如何工作的

【讨论】:

以上是关于我是不是需要手动关闭 EF 核心 Dbcontext 连接的主要内容,如果未能解决你的问题,请参考以下文章

EF中执行sql语句

在 EF 4.1 中拆分 Db 模型

我是不是需要知道如何手动创建数据结构以获得入门级工作,或者我应该只知道如何使用收集框架中的数据结构? [关闭]

七色花基本权限系统- 实现实体层和核心层解耦

拿EF模型并将其转换为数据表?

内存优化表(EF 核心 5)不支持保存点