在我在基本控制器中继承的应用程序中,应用程序中的每个其他控制器都继承自。
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
答案 0 :(得分:3)
实体框架遵循开放晚期和早期关闭原则。因此,它只在需要时打开连接,IE才能实现查询,然后尽快关闭它。
如果可以,您应该根据请求移动到单个上下文实例。这还可以在单个事务中保留请求期间发生的所有事情。如果使用依赖注入容器来实例化控制器,则可以非常轻松地完成此操作。
答案 1 :(得分:3)
因为您没有尝试在上下文的构造函数中自己创建和传递连接,然后,是的,正如其他人所说的那样,EF将根据需要从连接池获取/释放连接,而不是在构造它时。
请注意EF文档中的引用:
<强>连接强>
默认情况下,上下文管理与数据库的连接。上下文根据需要打开和关闭连接。例如,上下文打开一个连接来执行查询,然后在处理完所有结果集后关闭连接。
有些情况下,您希望更好地控制连接何时打开和关闭。例如,在使用SQL Server Compact时,打开和关闭相同的连接非常昂贵。您可以使用Connection属性手动管理此过程。
有关详细信息,请参阅以下链接:
答案 2 :(得分:1)
仅在执行查询时才打开连接。连接池由ADO.NET类(SqlConnection)管理。每个请求有多个DbContext实例是可以的,有时是必要的。一般情况下,您不会有两次连接数。