DbContext和连接池

时间:2015-06-19 15:07:54

标签: c# .net sql-server entity-framework dbcontext

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

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服务器的连接数量而不是需要的数量,如果它是后者,那么它可能不会太多一个问题。

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

实体框架6.1.3

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

请注意EF文档中的引用:

  

<强>连接

     

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

     

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

有关详细信息,请参阅以下链接:

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

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

答案 2 :(得分:1)

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