C# EF:在手动调用OpenConnection时,是否应该显式关闭数据库连接
我在构造函数中打开连接。 考虑这个代码:C# EF:在手动调用OpenConnection时,是否应该显式关闭数据库连接,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我在构造函数中打开连接。 考虑这个代码: public abstract class DataContext : DbContext, IDataContext { static DataContext() { if (DataContextConfiguration.UseSafePersian) { DbInterception.Add(new SafePersianInterceptor());
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();
}
}
当我显式打开连接时是否应该关闭连接
我使用实体框架
版本6
更新
我犯了这个错误,而且经常发生:
超时已过期。获取数据之前经过的超时时间
来自池的连接。发生这种情况的原因可能是所有的
连接正在使用,已达到最大池大小
通常,EF会在操作完成之前/之后自动打开和关闭连接。但是,如果您手动打开连接,EF将不会在数据库操作完成后为您关闭连接 如果不需要,最好关闭连接。DbContext是短期的(如果在您的场景中可能的话)也是最佳实践 无论如何,当DbContext对象被释放时(例如由垃圾收集器),连接将被关闭。但你应该在完成后马上关闭它
有关EF连接管理的更多信息,请参阅下一页。我们不知道此方法属于哪个类,因此目前无法回答此问题。什么是
base
question@spender,这是一个正确的猜测(:值得一提的是,如果使用using
子句初始化上下文,则连接将自动关闭。在这种情况下,它将由于disposing而关闭,因此它实际上不是DbContext本身的自动管理步骤。但是,使用using块几乎总是一个好主意。