许多查询和过多的打开/关闭相同的连接

6 c# database-connection entity-framework-4 self-tracking-entities

我必须一个接一个地重新计算大量实体的值.

在此过程中,所有自跟踪实体都在同一个ObjectContext中进行更改.对于需要处理的每个实体,必须从数据库中提取少量数据.这导致了许多相同的SQL查询,但使用了不同的参数.

我正在使用Solutions Design的ORM Profiler软件来分析发送到数据库的查询.

查询本身对我来说似乎没问题.它们很短,不需要太多时间来执行.

但是,我对分析器如何显示查询的实际处理方式感到困惑:

在此输入图像描述

如您所见,它保持打开和关闭相同的数据库连接.

现在,看一下单个Open/Query/Close连接的时间:

在此输入图像描述

看起来打开和关闭数据库连接会浪费时间.

看完这个答案后,我改变了我的代码所以现在它看起来像这样:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
    using (var context = new MyEntities(connection))
    {
        // ...
Run Code Online (Sandbox Code Playgroud)

我现在可以看到它仍然使用相同的连接(这很好),但是,连接仍然在查询之间保持关闭和打开.

Gert Arnold建议我在使用上下文之前明确打开连接.然后我修改了我的代码,看起来像这样:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
    connection.Open();
    using (var context = new MyEntities(connection))
    {
        // ...
Run Code Online (Sandbox Code Playgroud)

现在它有效!每个查询都发送到同一个数据库连接:

在此输入图像描述

我现在很好奇为什么在使用上下文之前需要打开连接?

Ger*_*old 6

可以使用现有连接创建上下文。很难找到有关它的文档,但如果在上下文使用连接之前显式打开连接,它将保持打开状态,直到显式关闭或处置为止。我用 EF5 ObjectContext(Linqpad 代码)对此进行了测试:

using (var conn = new EntityConnection(connectionString))
{
    conn.Open();
    using (var db = new InventoryContext(conn))
    {
        db.Products.ToList();
        conn.State.Dump();
        db.SaveChanges();
        conn.State.Dump();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是Open, Open。当连接未打开时,输出为Closed, Closed