我是不是需要手动关闭 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 连接的主要内容,如果未能解决你的问题,请参考以下文章