407

I am getting timeouts using the Entity Framework (EF) when using a function import that takes over 30 seconds to complete. I tried the following and have not been able to resolve this issue:

I added Default Command Timeout=300000 to the connection string in the App.Config file in the project that has the EDMX file as suggested here.

This is what my connection string looks like:

<add 
 name="MyEntityConnectionString" 
 connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
 res://*/MyEntities.msl;
 provider=System.Data.SqlClient;provider connection string=&quot;
 Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
 Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
 MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
 providerName="System.Data.EntityClient" />

I tried setting the CommandTimeout in my repository directly like so:

private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
 this.context.CommandTimeout = 180;
 return this.context.GetKirksFriends();
}

What else can I do to get the EF from timing out? This only happens for very large datasets. Everything works fine with small datasets.

Here is one of the errors I'm getting:

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.


OK - I got this working and it's silly what happened. I had both the connection string with Default Command Timeout=300000 and the CommandTimeout set to 180. When I removed the Default Command Timeout from the connection string, it worked. So the answer is to manually set the CommandTimeout in your repository on your context object like so:

this.context.CommandTimeout = 180;

Apparently setting the timeout settings in the connection string has no effect on it.

ADyson
62.9k16 gold badges90 silver badges100 bronze badges
asked Jun 3, 2011 at 20:58
5
  • Remove &quot; from connection string Commented Jun 3, 2011 at 21:00
  • refer to this as well stackoverflow.com/questions/4396833/sql-exception-with-net-4-ef Commented Jun 3, 2011 at 21:13
  • 5
    @hamlin11 In an EF connection string, that is required to define what part is connection string and what part is EF metadata. Leave &quot; in the string. Commented Jun 3, 2011 at 21:30
  • 2
    my suggestion is before you increase the timeout would to investigate first to see why EF is timing out. In Our case we realised that we needed to add NONCLUSTERED indexes to some of the tables, this resolved the timeout issue for us. Commented Jun 12, 2014 at 12:38
  • I am working with MS support on a SQL time out issue - this is when the DB is hosted in SQL Azure. I was told all Azure PaaS services (PaaS websites and SQL Azure etc) there is a universal timeout of 230 seconds, and this always takes precedence, even if you set a timeout manually. This is to protect resources of multi-tenanted PaaS infrastructure. Commented Aug 22, 2017 at 14:10

10 Answers 10

673

There is a known bug with specifying default command timeout within the EF connection string.

http://bugs.mysql.com/bug.php?id=56806

Remove the value from the connection string and set it on the data context object itself. This will work if you remove the conflicting value from the connection string.

Entity Framework Core:

this.context.Database.SetCommandTimeout(180);

Entity Framework 6:

this.context.Database.CommandTimeout = 180;

Entity Framework 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4 and below:

this.context.CommandTimeout = 180;
Sign up to request clarification or add additional context in comments.

16 Comments

How can I achieve this using edmx?
I don't believe this is a bug, but rather by design, see Remarks section here link
Because some settings are in ms and some in s, I looked it up here, CommandTimeout is in seconds.
In Entity Framework 7 you can set this in DbContext / IdentityDbContext's constructor: this.Database.SetCommandTimeout(180);
Wow... 5 versions of EF and 5 ways of setting CommandTimeout. None of the version fixed it in ConnectionString?
|
107

If you are using a DbContext, use the following constructor to set the command timeout:

public class MyContext : DbContext
{
 public MyContext ()
 {
 var adapter = (IObjectContextAdapter)this;
 var objectContext = adapter.ObjectContext;
 objectContext.CommandTimeout = 1 * 60; // value in seconds
 }
}
answered Oct 17, 2012 at 21:52

11 Comments

@ErickPetru, so you can easily change it to a different number of minutes :), also I would not be too surprised if the compiler optimizes out that multiplication!
@JoelVerhagen, do not be surprised. Here is a good explanation of when auto optimization occurs: stackoverflow.com/questions/160848/…. In this case, I suppose that even happen (since they are two literal values​​), but honestly I think the code is kind of strange this way.
meh...children are starving...who cares about 1*60?
@ErikPetru, this is actually a very common practice and makes the code more readable.
Well, if you want to make it readable, use (int)TimeSpan.FromMinutes(1).TotalSeconds
|
55

If you are using DbContext and EF v6+, alternatively you can use:

this.context.Database.CommandTimeout = 180;
answered Nov 5, 2013 at 19:17

Comments

22

If you are using Entity Framework like me, you should define Time out on Startup class as follows:

 services.AddDbContext<ApplicationDbContext>(
 options => options.UseSqlServer(
 Configuration.GetConnectionString("DefaultConnection"), 
 a => a.CommandTimeout(180)));
Konrad Viltersten
40.3k91 gold badges297 silver badges528 bronze badges
answered Aug 1, 2018 at 17:52

Comments

15

Usually I handle my operations within a transaction. As I've experienced, it is not enough to set the context command timeout, but the transaction needs a constructor with a timeout parameter. I had to set both time out values for it to work properly.

int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}

At the end of the function I set back the command timeout to the previous value in prevto.

Using EF6

philu
8761 gold badge9 silver badges17 bronze badges
answered Oct 19, 2015 at 16:17

2 Comments

Not a good approach at all. I used to add lot of transaction scope and it become a nightmare to me in a project. Eventually replaced all transaction scope with a single SAVEChanges() in EF 6+. Check this coderwall.com/p/jnniww/…
This answer should have higher vote. I tried all different ways to increase the timeout but only when I set BOTH context command timeout and Transaction scope then it worked.
10

I know this is very old thread running, but still EF has not fixed this. For people using auto-generated DbContext can use the following code to set the timeout manually.

public partial class SampleContext : DbContext
{
 public SampleContext()
 : base("name=SampleContext")
 {
 this.SetCommandTimeOut(180);
 }
 public void SetCommandTimeOut(int Timeout)
 {
 var objectContext = (this as IObjectContextAdapter).ObjectContext;
 objectContext.CommandTimeout = Timeout;
 }
}
answered Nov 13, 2017 at 16:15

3 Comments

Add your missing } at the end for the partial.
Thanks! This worked from my EF 4.4.0 project. Yes, old, but works!
This post seems to have a long life. I implemented something similar as a reflex but now I am trying to justify to myself why creating a separate function (your "SetCommandTimeOut") is a good idea. Can you help me out?
10

In .NET Core use the following syntax to change the timeout from the default 30 seconds to 90 seconds:

public class DataContext : DbContext
{
 public DataContext(DbContextOptions<DataContext> options) : base(options)
 {
 this.Database.SetCommandTimeout(90); // <-- 90 seconds
 }
}
answered Jul 20, 2020 at 2:40

Comments

3

This is what I've fund out. Maybe it will help to someone:

So here we go:

If You use LINQ with EF looking for some exact elements contained in the list like this:

await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync();

everything is going fine until IdList contains more than one Id.

The "timeout" problem comes out if the list contains just one Id. To resolve the issue use if condition to check number of ids in IdList.

Example:

if (IdList.Count == 1)
{
 result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync();
}
else
{
 result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync();
}

Explanation:

Simply try to use Sql Profiler and check the Select statement generated by Entity frameeork. ...

Anto Varghese
3,3016 gold badges33 silver badges39 bronze badges
answered Aug 15, 2014 at 8:08

Comments

2

For Entity framework 6 I use this annotation and works fine.

 public partial class MyDbContext : DbContext
 {
 private const int TimeoutDuration = 300;
 public MyDbContext ()
 : base("name=Model1")
 {
 this.Database.CommandTimeout = TimeoutDuration;
 }
 // Some other codes
 }

The CommandTimeout parameter is a nullable integer that set timeout values as seconds, if you set null or don't set it will use default value of provider you use.

answered Oct 16, 2020 at 8:19

Comments

0

Adding the following to my stored procedure, solved the time out error by me:

SET NOCOUNT ON;
SET ARITHABORT ON;
answered Jul 22, 2020 at 14:51

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.