EF:手动调用 OpenConnection 时是不是应该显式关闭数据库连接

Posted

技术标签:

【中文标题】EF:手动调用 OpenConnection 时是不是应该显式关闭数据库连接【英文标题】:EF: Should I explicitly close database connection when calling OpenConnection manuallyEF:手动调用 OpenConnection 时是否应该显式关闭数据库连接 【发布时间】:2015-03-19 23:14:33 【问题描述】:

我在构造函数中打开连接。 考虑这段代码:

public abstract class DataContext : DbContext, IDataContext

    static DataContext()
    
        if (DataContextConfiguration.UseSafePersian)
        
            DbInterception.Add(new SafePersianInterceptor());                
        
    

    private readonly bool _saveChangesOnModify = false;

    protected DataContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    
        this.OpenConnection();
    
   internal void OpenConnection()
        
            if (((IObjectContextAdapter)this).ObjectContext.Connection.State != ConnectionState.Open)
                ((IObjectContextAdapter)this).ObjectContext.Connection.Open();
        
    

当我明确打开连接时是否应该关闭连接?

我使用Entity Framework 版本 6。

更新

我收到了这个错误,而且它经常发生:

超时。在获得一个之前的超时时间 来自池的连接。这可能是因为所有汇集的 正在使用连接并且已达到最大池大小。

【问题讨论】:

我们不知道这个方法在哪个类,所以这个问题暂时无法回答。 base 是什么? @spender,我认为它会覆盖 DbContext @haim770 假设就像猜测。 @spender 我更新了我的问题 @spender,在这种情况下是正确的猜测(-: 【参考方案1】:

通常 EF 在操作完成之前/之后自动打开和关闭连接。但是,如果您手动打开连接,EF 不会在数据库操作完成后为您关闭它。

如果不需要,最好关闭连接。 DbContext 的最佳实践也是短暂的(如果在您的场景中可能的话)。

无论如何,当你的 DbContext 对象被释放(例如由垃圾收集器)时,连接将被关闭。但你应该在完成后立即关闭它。

有关EF连接管理的更多信息,请参考以下MSDN页面。

【讨论】:

值得一提的是,如果使用using 子句初始化上下文,连接自动关闭。 在这种情况下,它将因为处置而被关闭,因此它实际上并不是 DbContext 本身的自动管理步骤。但确实,使用 using 块几乎总是一个好主意。

以上是关于EF:手动调用 OpenConnection 时是不是应该显式关闭数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

EF 存储过程(下)

EF手动/动态表注册

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

EF Core 3.0 手动设置连接字符串

实体框架手动删除的表不能从EF迁移生成

EF Core 2.0中如何手动映射数据库的视图为实体