实体框架超时

时间:2011-06-03 20:58:52

标签: c# asp.net entity-framework entity-framework-4 connection-string

当使用功能导入需要超过30秒才能完成时,我将使用实体框架(EF)获得超时。我尝试了以下操作并且无法解决此问题:

我将Default Command Timeout=300000添加到项目中 App.Config 文件中的连接字符串,该文件包含建议的here的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超时?这仅适用于非常大的数据集。小数据集一切正常。

以下是我遇到的错误之一:

  

System.Data.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---&GT; System.Data.SqlClient.SqlException:超时已过期。操作完成之前经过的超时时间或服务器没有响应。


好的 - 我得到了这个工作,发生了什么事很愚蠢。我有连接字符串Default Command Timeout=300000和CommandTimeout设置为180.当我从连接字符串中删除Default Command Timeout时,它工作。所以答案是在您的上下文对象上手动设置CommandTimeout,如下所示:

this.context.CommandTimeout = 180;

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

11 个答案:

答案 0 :(得分:508)

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

答案 1 :(得分:95)

如果您使用的是DbContext,请使用以下构造函数设置命令timeout:

public class MyContext : DbContext
{
    public MyContext ()
    {
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 1 * 60; // value in seconds
    }
}

答案 2 :(得分:34)

如果您使用的是DbContext和EF v6 +,您也可以使用:

this.context.Database.CommandTimeout = 180;

答案 3 :(得分:9)

通常我会在交易中处理我的操作。正如我所经历的那样,设置上下文命令超时是不够的,但是事务需要一个带有timeout参数的构造函数。我必须设置两个超时值才能正常工作。

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

在函数结束时,我将命令timeout设置为prevto中的上一个值。

使用EF6

答案 4 :(得分:3)

我知道这是非常老的线程运行,但仍然EF没有修复此问题。对于使用自动生成的<Dropdown selectedKey={ selectedItem && selectedItem.key } onChanged={ item => this.setState({selectedItem: item}) } options={ [ { key: 'A', text: 'Option a' }, { key: 'B', text: 'Option b' }, ] } />的用户,可以使用以下代码手动设置超时。

DbContext

答案 5 :(得分:2)

如果像我一样使用Entity Framework,则应按以下方式定义“启动时超时”类:

 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));

答案 6 :(得分:1)

这就是我所资助的。也许这会对某人有所帮助:

所以我们走了:

如果你使用LINQ和EF寻找列表中包含的一些确切元素,如下所示:

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

在IdList包含多个Id之前,一切正常。

如果列表只包含一个Id,则会出现“超时”问题。要解决此问题,请使用if条件来检查IdList中的ID数。

示例:

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();
}

说明:

只需尝试使用Sql Profiler并检查实体frameeork生成的Select语句。 ...

答案 7 :(得分:1)

如果您使用的是DbContext和EF v6 +,则可以使用 CommandTimeout 属性

this.context.Database.CommandTimeout = 180;

答案 8 :(得分:1)

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

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

答案 9 :(得分:0)

在我的存储过程中添加以下内容,解决了我的超时错误:

SET NOCOUNT ON;
SET ARITHABORT ON;

答案 10 :(得分:0)

对于Entity Framework 6,我使用此注释并可以正常工作。

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

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

CommandTimeout参数是可设置超时的可为空的整数 值,以秒为单位,如果您设置为null或不设置,它将使用默认值 您使用的提供者的价值。