2014-09-27 60 views
0

当我使用单个上下文向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]:打开连接27.09.2014 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毫秒结果:SqlDataReader的

2014年9月27日16时27分54秒[SQL]:00

2014年9月27日16时27分54秒[:在2014年9月27日16时27分54秒04关闭的连接SQL]:打开连接27.09.2014 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 ]

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连接和/或强制它打开单个连接,直到dis摆出或直到被告知关闭它?

+0

您使用连接池吗? – Mairaj 2014-09-27 13:04:17

+0

默认情况下。但是我需要将所有请求都放在一个连接中,因为实际上最多只有15个请求。 – 2014-09-27 13:18:37

回答

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。