DbContext和连接池

7
在我继承的一个应用程序中,有一个基本控制器,在应用程序中的每个其他控制器都会继承它。
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 Server,如果是后者,那可能不是太大的问题。
我不认为我可以立即重构它,当然没有理由。我应该意识到这种设计的潜在问题有哪些?
实体框架6.1.3

这是哪个版本的EF?您能展示一下“ MyDbContext”的构造函数吗?那将提供回答您问题所需的详细信息。 - sstan
更新了问题。 - MrBliz
3个回答

5
由于您在上下文的构造函数中没有尝试创建和传递连接,因此,是的,正如其他人所说,EF将根据需要从连接池获取/释放连接,而不是在构造时。请注意来自EF文档的以下引用:“默认情况下,上下文管理与数据库的连接。 上下文根据需要打开和关闭连接。 例如,上下文打开连接以执行查询,然后在处理完所有结果集后关闭连接。”有些情况下,您想要更多地控制连接何时打开和关闭。 例如,在使用SQL Server Compact时,打开和关闭相同的连接很昂贵。 您可以通过使用Connection属性手动管理此过程。请参阅以下链接以了解更多信息:

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

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


3

Entity Framework 遵循开放封闭原则。因此,它只在需要时打开连接(例如为了实现查询),然后尽快关闭连接。

如果可以的话,建议每个请求只使用一个上下文实例。这样可以将请求期间发生的所有操作都保留在单个事务中。如果您正在使用依赖注入容器来实例化控制器,则可以轻松地实现这一点。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接