【问题标题】:Does DbContext holds an opened connection during its life-cycle?DbContext 在其生命周期中是否保持打开的连接?
【发布时间】:2019-04-16 02:26:36
【问题描述】:

这个问题很清楚。 DbContext 在其生命周期中是否保持打开的连接? EF核心呢?

【问题讨论】:

  • 不,不,除非您通过启动事务并保持打开状态来强制它。否则,它只会在加载或保存时打开一个连接,并在完成后关闭它。您可以使用 SQL Server 探查器或扩展事件轻松验证这一点
  • 你听说过connection-pooling吗?它也适用于DbContext,并且连接字符串指定是否使用它。请参阅:ConnectionString(在下方pooling
  • 为什么这个问题?听起来您遇到了不同的问题并认为连接管理有问题?或者认为池连接在某种程度上是个问题?他们不是
  • @PanagiotisKanavos 这就是答案。发布它以获得接受。谢谢。
  • @AndrzejMartyna 我们也不必担心 ADO.NET 的这一点 - 自 2000 年以来就存在连接池,并且 DataSet/DataTable 旨在断开连接。问题只是由于糟糕的编码实践而发生。不幸的是,人们也找到了破坏 EF 和 EF Core 的方法,通过打开和保持事务打开而没有真正的原因,通常是在使用“通用”存储库 antipattern 之后

标签: c# entity-framework lifecycle dbconnection


【解决方案1】:

正如其他人所说,不,它不会,除非您手动打开连接并将其传递给 DbContext 构造函数。

具体的详细答案可以在这里https://stackoverflow.com/a/45330219/191148找到。

@ajcvickers 在https://github.com/aspnet/EntityFrameworkCore/issues/7810 中的评论清除了它:

如果 EF 创建了 DbConnection 对象,那么 EF 将确保它是 在释放 DbContext 时释放。另一方面,如果一些 其他代码创建 DbConnection 对象并将其传递给 EF,然后 其他代码也有责任处理 适当的连接。

类似的规则适用于打开和关闭连接。如果 EF 打开 连接,然后 EF 将在完成后关闭连接 它。如果您的代码打开了连接,那么您的代码应该关闭 连接。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多