当我使用一个需要超过30秒才能完成的函数导入时,我使用实体框架(EF)得到超时。我尝试了以下方法,但未能解决此问题:

我将默认命令超时=300000添加到项目中的App.Config文件中的连接字符串中,该文件具有此处建议的EDMX文件。

这是我的连接字符串的样子:

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

我尝试在我的存储库中直接设置CommandTimeout,如下所示:

private TrekEntities context = new TrekEntities();

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

我还能做什么来从计时超时中获得EF ?这只发生在非常大的数据集上。对于小型数据集,一切都很好。

这是我得到的错误之一:

entitycommandexecutionexception:在执行命令定义时发生错误。详情请参阅内部异常。——> System.Data.SqlClient.SqlException:超时。操作完成之前的超时时间或服务器没有响应。


好吧,我把它弄好了,发生的事情很愚蠢。我将连接字符串的Default CommandTimeout =300000和CommandTimeout设置为180。当我从连接字符串中删除默认命令超时时,它起作用了。所以答案是在你的存储库中手动设置CommandTimeout在你的context对象上,如下所示:

this.context.CommandTimeout = 180;

显然,在连接字符串中设置超时设置对它没有影响。


当前回答

在。NetCore (NetCore)中,使用以下语法将超时时间从默认的30秒更改为90秒:

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
        this.Database.SetCommandTimeout(90); // <-- 90 seconds
    }
}

其他回答

在EF连接字符串中指定默认命令超时有一个已知的错误。

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

从连接字符串中删除值,并将其设置在数据上下文对象本身上。如果从连接字符串中删除冲突值,这将有效。

实体框架核心1.0:

this.context.Database.SetCommandTimeout(180);

实体框架6:

this.context.Database.CommandTimeout = 180;

实体框架5:

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

实体框架4及以下:

this.context.CommandTimeout = 180;

在。NetCore (NetCore)中,使用以下语法将超时时间从默认的30秒更改为90秒:

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
        this.Database.SetCommandTimeout(90); // <-- 90 seconds
    }
}

对于实体框架6,我使用这个注释并且工作良好。

  public partial class MyDbContext : DbContext
  {
      private const int TimeoutDuration = 300;

      public MyDbContext ()
          : base("name=Model1")
      {
          this.Database.CommandTimeout = TimeoutDuration;
      }
       // Some other codes
    }

CommandTimeout参数是一个设置超时的可空整数 值为秒,如果你设置为空或不设置它将使用默认 所使用的提供者的值。

通常我在事务中处理我的操作。根据我的经验,仅仅设置上下文命令timeout是不够的,但是事务需要一个带有timeout参数的构造函数。为了让它正常工作,我必须设置两个超时值。

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

在函数结束时,我将命令超时设置回prevto中的前一个值。

使用EF6

如果你正在使用DbContext和EF v6+,或者你可以使用:

this.context.Database.CommandTimeout = 180;