如何在实体框架中关闭连接字符串对象



今天,当我从以下代码运行我的应用程序时,我遇到了异常

dbContext.ManageTasks.Where(x => x.IsDeleted == false).ToList();

错误是

超时已过期。从池获取连接之前经过的超时期限。这可能是因为所有池连接都在使用中,并且已达到最大池大小。

我从这个讨论中得到了一个解决方案:如何解决 ASP.NET 和SQL Server之间的连接池问题?

解决方案是:如果我关闭当前连接字符串对象,那么此错误将消失。

SqlConnection myConnection = new SqlConnection(ConnectionString);
myConnection.Open();
// some code
myConnection.Close();        

上面的代码用于 ADO.NET,而不是实体框架。

如何在实体框架中关闭连接字符串对象?

我有点不确定为什么你需要使用"SqlConnection"。DbContext 是一个一次性类。我发现最安全的清理方法是使用"using"标签。例如

using(DbContext _context = new MyContext())
{
     \Your Work here
}

这将自动调用_context。Dispose() 当它到达右大括号时,这实际上关闭了您的连接。

另一种选择是:

DbContext _context = new MyContext();
_context.ManageTasks.Where(x => x.IsDeleted == false).ToList();
_context.Dispose();

这确实意味着,如果发生异常,可能会错过释放调用。

希望这有帮助。

有用的链接

为了处理事务范围并帮助释放对象,您可能需要查看存储库模式和 unitOfWork 模式。或两者兼而有之。

此外,我知道使用依赖注入来处理很多连接。我只是确保它们是作用域(每个 Web 请求):)

您可能在类中的某个地方保留了一个全局变量dbContext。你不应该那样做!

您可以使用DbContext实现的 IDisposable 接口并使用 using 语句。您可以在需要时初始化新DbContext

using (YourDbContext dbContext = ...)
{
    // do some actions
}
// context will be closed

使用 using 的好处是它会关闭和释放,即使里面的代码会引发异常。

最新更新