9

I would like to set the ConnectionTimeout to something other than the default, which is 15 seconds. I have inherited some code that uses EntityFramework and the app.config looks like this:

<configuration>
   <configSections>
      <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS; Integrated Security=True; ConnectionTimeout=30; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; ConnectionTimeout=30; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>
</entityFramework>

I'm the one who added the sectino in an attempt to get things working. I can tell it's not working be setting a breakpoint at:

var adapter = (IObjectContextAdapter) this;
var objectContext = adapter.ObjectContext;
objectContext.CommandTimeout = CommandTimeoutSeconds;
int test = objectContext.Connection.ConnectionTimeout;

test is always 15. What is going on? Can someone tell me how to set ConnectionTimeout? I have tried both "ConnectionTimeout" and "Connection Timeout" I.e. no space vs. space.

Can someone help me? I'm pulling my hair out. I'm sure it's a simple fix! Dave

Additional info. In response to comment, here is my DbContext derived class...

public class SessionDataContext : DbContext
{
    // Command timeout (seconds)
    private const int CommandTimeoutSeconds = 30;

    /// <summary>
    /// Constructor that takes db name.
    /// The connection string and db itself is configured in the this project's app.config file
    /// </summary>
    /// <param name="dbName"></param>
    public SessionDataContext(string dbName) : base(dbName)
    {
        Database.SetInitializer(new SessionDataContextInitializer());

        // Set timeout (based on code from http://stackoverflow.com/questions/6232633/entity-framework-timeouts)
        var adapter = (IObjectContextAdapter) this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = CommandTimeoutSeconds;
        int test = objectContext.Connection.ConnectionTimeout;
    }

    /// <summary>
    /// Session table's records
    /// </summary>
    public DbSet<Session> Sessions { get; set; }

    /// <summary>
    /// SessionType table's records
    /// </summary>
    public DbSet<SessionType> SessionTypes { get; set; }
}
4

1 に答える 1

7

問題を引き起こしたのは私の愚かさでした!将来誰かがこの問題を抱えた場合に備えて、ここに私の答えを入れます。上で入力したものはすべて正しく、正常に動作します。ただし、私が見ていた app.config ファイルは、クラス ライブラリ (DataAccess レイヤー) にありました。実際、これはまったく使用されておらず、デフォルトの EntityFramework 設定が使用されていました。何が原因で試してみたのかはわかりませんが、app.config 設定を DataAccess レイヤーの app.config からメインの app.config に移動したところ、すべてがうまく機能しました。コードを継承した以外に弁護で言えることは、 app.config の値が使用されておらず、それらを呼び出したり、独自のコードで使用したりしていないことがわかりません。むしろ、MultipleActiveResultSets と ConnectionTimeout は、基になる Entity Framework によって使用されます。

于 2013-08-29T22:45:49.167 に答える