繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM