web-dev-qa-db-ja.com

EntityFramework使用時の接続タイムアウトの設定

ConnectionTimeoutをデフォルト以外の15秒に設定したいと思います。 EntityFrameworkを使用するコードをいくつか継承しましたが、app.configは次のようになります。

<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>

私は物事を機能させるためにセクチノを追加した人です。次の場所にブレークポイントを設定しても機能しないことがわかります。

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

テストは常に15です。何が起こっているのですか?誰かがConnectionTimeoutを設定する方法を教えてもらえますか? 「ConnectionTimeout」と「ConnectionTimeout」の両方を試しました。スペースなしvs.スペース。

誰かが私を助けることができますか?髪を抜いています。簡単な修正だと確信しています。デイブ

追加情報。コメントに応えて、これが私のDbContext派生クラスです...

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; }
}
9
Dave

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

7
Dave