EF DBContext配置不关闭连接

我使用的是EF 6.1.0

我在DBEntites下面有自定义DBContex对象

public partial class DbEntities : DbContext { public DbEntities() : base("name=DbEntities") { ////Configuration.LazyLoadingEnabled = true; ////Configuration.ProxyCreationEnabled = false; } //// I have ALL Entites added as below ////public virtual IDbSet CCodes { get; set; } } 

我在上下文对象上有以下操作

 using (var context = new DbEntities()) { var entitySet = context.Set(); var res = entitySet.Where(predicate).ToList(); if (context.Database.Connection.State == ConnectionState.Open) { context.Database.Connection.Close(); } return res; } 

但在处理完上下文对象后,我仍然可以看到一个活动的数据库连接。 在连接状态条件下,我可以看到连接已经关闭(连接从未成立)。

我使用以下查询来查看SQL上的连接。

 select db_name(dbid) , count(*) 'connections count' from master..sysprocesses where spid > 50 and spid != @@spid group by db_name(dbid) order by count(*) desc 

在下面的语句中,sql连接数增加了。 但即使在处置后它也从未停止过。 (我的意思是在使用块后,它应该关闭连接)。

 var res = entitySet.Where(predicate).ToList(); 

任何帮助将不胜感激。

正如评论中所指出的那样,原因确实是由.NET执行的连接池。 由于性能原因,.NET为您在应用程序中使用的每个连接字符串维护一个连接池(因为打开和关闭连接通常可能在性能方面成本很高)。 该池具有一定的最小和最大大小(由MinPoolSizeMaxPoolSize连接字符串参数控制)。 当你打开一个连接(通过SqlConnection.Open ) – 它可能会从池中取出而不是真的重新打开。 当您关闭连接时(也通过处理EF上下文完成) – 连接可能会被放入池中,而不是真正关闭。 当连接空闲一段时间(大约5分钟)时 – 它可能会从池中删除。

如果您(由于某种原因)想要避免这种情况,您可以将MaxPoolSize设置为0以用于连接字符串,或者通过SqlConnection.ClearPoolSqlConnection.ClearAllPools显式清除池。