[英]How can I close connection string object in Entity Framework
今天,当我从下面的代码运行我的应用程序时出现异常
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(DbContext _context = new MyContext())
{
\\Your Work here
}
当它到达实际上关闭您的连接的结束大括号时,这将自动调用 _context.Dispose()。
替代方案是:
DbContext _context = new MyContext();
_context.ManageTasks.Where(x => x.IsDeleted == false).ToList();
_context.Dispose();
这确实意味着如果发生异常,可能会错过 dispose 调用。
希望这可以帮助。
为了处理事务范围并帮助处理对象,您可能需要查看存储库模式和 unitOfWork 模式。 或者两者兼而有之。
除此之外,我知道使用 DependencyInjection 来处理大量连接。 我只是确保它们是 Scoped(每个 Web 请求):)
您可能在类中的某处保留了一个全局变量dbContext
。 你不应该那样做!
您可以使用DbContext
实现的IDisposable
接口并使用using
语句。 只要需要,就初始化一个新的DbContext
:
using (YourDbContext dbContext = ...)
{
// do some actions
}
// context will be closed
使用using
的好处是它会关闭和处理,即使里面的代码会抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.