【问题标题】:Entity Framework opens new connection for each request实体框架为每个请求打开新连接
【发布时间】:2014-11-22 08:57:18
【问题描述】:

当我使用单个上下文向 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]:在 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

27.09.2014 16:27:54 [SQL]:在 27.09.2014 16:27:54 +04:00 关闭连接

27.09.2014 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].[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 毫秒内完成,结果:SqlDataReader

27.09.2014 16:27:54 [SQL]:在 27.09.2014 16:27:54 +04:00 关闭连接

等等……

有什么方法可以控制 EF dbcontext 连接和/或强制它打开单个连接直到被释放或被告知关闭它?

【问题讨论】:

  • 你在使用连接池吗?
  • 默认情况下。但我需要将所有请求都放在一个连接中,因为实际上最多有不少于 15 个请求。

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


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多