2014-09-27 97 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。