DbContext和连接池

在我inheritance的应用程序中,这是在基本控制器中,应用程序中的每个其他控制器都inheritance自。

public BaseController() { db = new MyDbContext(); db.Database.Log = s => Debug.Write(s); } public MyDbContext() : base("name=MyDbContext") { // hack to force Visual Studio to deploy the Entityframework.SqlServer package var instance = SqlProviderServices.Instance; } 

由于应用程序的设计方式,每个请求至少创建2个上下文。 (这是一个MVC应用程序,每个页面都调用HomeController以及为特定页面调用其他控制器。)

我的问题是DbContext创建与SQL Server的连接? 是在创建上下文时,还是仅在执行查询时?

如果它是前者,那么我将使用两倍于SQL服务器的连接数量而不是需要的数量,如果它是后者那么它可能不是太大的问题。

我不认为我能在不久的将来重构这一点,当然也不是没有道理的。 我应该注意这个设计有哪些潜在的缺陷?

entity framework6.1.3

因为您没有尝试在上下文的构造函数中自己创建和传递连接,所以,正如其他人所说,EF将根据需要从连接池获取/释放连接,而不是在构造时。

请注意EF文档中的引用:

连接

默认情况下,上下文管理与数据库的连接。 上下文根据需要打开和关闭连接。 例如,上下文打开一个连接以执行查询,然后在处理完所有结果集时关闭连接。

有些情况下,您希望更好地控制连接何时打开和关闭。 例如,使用SQL Server Compact时,打开和关闭相同的连接非常昂贵。 您可以使用Connection属性手动管理此过程。

有关更多信息,请参阅以下链接:

https://msdn.microsoft.com/en-us/data/jj729737

https://msdn.microsoft.com/en-us/data/dn456849

entity framework遵循开放晚期和早期关闭原则。 因此,它只在需要时打开连接,IE实现查询,然后尽快关闭它。

如果可以,您应该根据请求移动到单个上下文实例。 这还可以在单​​个事务中保留请求期间发生的所有事情。 如果使用dependency injection容器来实例化控制器,则可以非常轻松地执行此操作。

只有在执行查询时才会打开连接。 连接池由ADO.NET类(SqlConnection)管理。 每个请求有多个DbContext实例是可以的,有时是必要的。 一般来说,您不会有两次连接数。