DbContext在其生命周期内是否持有一个打开的连接?

6
问题很明确。在其生命周期内,DbContext 是否保持着 打开的连接?EF Core 又是如何处理的呢?

2
不会,除非你通过启动并保持事务来强制它。否则,它只在加载或保存时打开连接,并在完成后关闭连接。您可以使用SQL Server分析器或扩展事件轻松验证这一点。 - Panagiotis Kanavos
1
你听说过连接池吗?它同样适用于DbContext,并且通过连接字符串指定是否使用。请参阅:ConnectionString(在“pooling”一节中)。 - Tim Schmelter
1
为什么会有这个问题呢?听起来你遇到了不同的问题,认为连接管理有问题?或者认为池化连接是一个问题?它们并不是。 - Panagiotis Kanavos
@PanagiotisKanavos 这是一个答案。发布它以获得接受。谢谢。 - amiry jd
1
@AndrzejMartyna,我们在ADO.NET中也不必担心这个问题——自2000年以来就存在连接池,并且DataSet/DataTable旨在脱机工作。问题只是由于糟糕的编码实践而导致的。不幸的是,人们发现了破坏EF和EF Core的方法,即在没有真正原因的情况下打开和保持事务,通常是在使用“通用”存储库模式之后。 - Panagiotis Kanavos
显示剩余5条评论
1个回答

3
正如其他人指出的那样,如果您没有手动打开连接并将其传递给DbContext构造函数,则不会(自动)发生连接。
可以在此处找到一个具体详细的答案:https://dev59.com/LaPia4cB1Zd3GeqP3shz#45330219
@ajcvickers在 https://github.com/aspnet/EntityFrameworkCore/issues/7810 中的评论清楚地解释了这一点:
如果EF创建DbConnection对象,则EF将确保在DbContext被处理时它被处理。另一方面,如果某些其他代码创建DbConnection对象并将其传递给EF,则其他代码应负责适当处理该连接。
类似的规则也适用于打开和关闭连接。如果EF打开连接,则EF将在完成后关闭连接。如果您的代码打开连接,则您的代码应关闭连接。

1
非常感谢。我还找到了这个链接:https://www.brentozar.com/archive/2015/07/database-connection-hazards-with-entity-framework/,由Julie Lerman评论。她描述了底层连接发生的具体情况。 - amiry jd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接