Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting ConnectionTimeout when using EntityFramework

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; }
}
like image 340
Dave Avatar asked Aug 23 '13 17:08

Dave


1 Answers

It was stupidity on my part that was causing the problem! I put my answer here in case anyone in the future has this problem. Everything I typed above is correct and will work fine. However, the app.config file I was looking at was in a class library (our DataAccess layer). In fact, it was not being used at all and default EntityFramework settings were being used. I'm mot sure what led me to try it, but I moved the app.config settings from the DataAccess layer app.config to the main app.config and all worked beautifully. About all I can say in my defense other than I inherited the code is that it's not clear to me to see that the values in the app.config are not being used and one does not call them or use them in one's own code. Rather, MultipleActiveResultSets and ConnectionTimeout are used by the underlying Entity Framework.

like image 108
Dave Avatar answered Nov 06 '22 09:11

Dave