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

本文关键字:连接 请求 框架 实体 | 更新日期: 2023-09-27 18:24:50

当我使用单个上下文向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为每个查询创建一个到数据库的新连接,在这种情况下是四次:

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

2014年9月27日16:27:54[SQL]:选择[Extent1]。[id]AS[id]、[Extent1]。[名称]AS[名称],[范围1]。[task_id]AS[task_id]FROM[dbo]。[TaskItems]AS[Extent1]

2014年9月27日16:27:54[SQL]:--在2014年9日27日16:27-54+04:00 执行

2014年9月27日16:27:54[SQL]:--在0毫秒内完成,结果:SqlDataReader

2014年9月27日16:27:54[SQL]:在2014年9月份27日关闭连接16:27:54+04:00

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

2014年9月27日16:27:54[SQL]:选择[Extent1]。[id]AS[id]、[Extent1]。[名称]AS[名称],[范围1]。[城市]AS[城市],[延伸1]。[unit_type_id]AS[unit_ttype_id]FROM[dbo]。【单位】AS【延伸1】

2014年9月27日16:27:54[SQL]:--在2014年9日27日16:27-54+04:00 执行

2014年9月27日16:27:54[SQL]:--在0毫秒内完成,结果:SqlDataReader

2014年9月27日16:27:54[SQL]:在2014年9月份27日关闭连接16:27:54+04:00

等等。。。

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

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

看起来我是疏忽大意。很简单:

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。