实体框架为每个请求打开新连接

时间:2014-09-27 13:01:48

标签: c# asp.net-mvc entity-framework

当我使用单个上下文向SQL发出多个请求时,EF会为每个请求打开新连接。例如,此代码从数据库中获取了几个列表:

using(MyContext nctx = new MyContext())
{
    var dictAllSelects = new Dictionary<string, SelectList>(){
        {"sl_task_id", new SelectList(nctx.Tasks.ToArray(), "id", "name")},
        {"sl_task_item_id", new SelectList(nctx.TaskItems.ToArray(), "id", "name")},
        {"sl_unit_id", new SelectList(nctx.Units.ToArray(), "id", "name")},
        {"sl_unit_type_id", new SelectList(nctx.UnitTypes.ToArray(), "id", "name")}
    };
}

EF为每个查询创建一个新的数据库连接,在这种情况下是四次:

  

27.09.2014 16:27:54 [SQL]:在2014年9月27日16:27:54 +04:00打开连接

     

27.09.2014 16:27:54 [SQL]:SELECT [Extent1]。[id] AS [id],[Extent1]。[name] AS [name],[Extent1]。[task_id] AS [task_id ] FROM [dbo]。[TaskItems] AS [Extent1]

     

27.09.2014 16:27:54 [SQL]: - 执行时间为27.09.2014 16:27:54 +04:00

     

27.09.2014 16:27:54 [SQL]: - 在0 ms内完成,结果为:SqlDataReader

     

27.09.2014 16:27:54 [SQL]:关闭连接时间为27.09.2014 16:27:54 +04:00

     

27.09.2014 16:27:54 [SQL]:在2014年9月27日16:27:54 +04:00打开连接

     

27.09.2014 16:27:54 [SQL]:SELECT [Extent1]。[id] AS [id],[Extent1]。[name] AS [name],[Extent1]。[city] AS [city] ],[Extent1]。[unit_type_id] AS [unit_type_id] FROM [dbo]。[Units] AS [Extent1]

     

27.09.2014 16:27:54 [SQL]: - 执行时间为27.09.2014 16:27:54 +04:00

     

27.09.2014 16:27:54 [SQL]: - 在0 ms内完成,结果为:SqlDataReader

     

27.09.2014 16:27:54 [SQL]:关闭连接时间为27.09.2014 16:27:54 +04:00

     

等...

有没有办法控制EF dbcontext连接和/或强制它打开单个连接,直到被处理或被告知关闭它?

1 个答案:

答案 0 :(得分:1)

看起来我很无意中。这很简单:

using(MyContext nctx = new MyContext())
{
    nctx.Database.Connection.Open();
    var dictAllSelects = new Dictionary<string, SelectList>(){
        {"sl_task_id", new SelectList(nctx.Tasks.ToArray(), "id", "name")},
        {"sl_task_item_id", new SelectList(nctx.TaskItems.ToArray(), "id", "name")},
        {"sl_unit_id", new SelectList(nctx.Units.ToArray(), "id", "name")},
        {"sl_unit_type_id", new SelectList(nctx.UnitTypes.ToArray(), "id", "name")}
    };
    nctx.Database.Connection.Close();
}

需要更仔细地阅读MSDN。