如何在Entity Framework中关闭连接字符串对象

时间:2015-04-21 10:02:00

标签: c# asp.net entity-framework

今天,当我从下面的代码

运行我的应用程序时,我遇到了异常
dbContext.ManageTasks.Where(x => x.IsDeleted == false).ToList();

错误是

  

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

我从这次讨论中得到了一个解决方案:How can I solve a connection pool problem between ASP.NET and SQL Server?

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

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

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

如何关闭Entity Framework中的连接字符串对象?

2 个答案:

答案 0 :(得分:4)

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

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

using (YourDbContext dbContext = ...)
{
    // do some actions
}

// context will be closed

使用using的好处是它会关闭并处理掉,即使里面的代码会抛出异常。

答案 1 :(得分:3)

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

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模式。或both