当我使用一个需要超过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;

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


当前回答

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

this.context.Database.CommandTimeout = 180;

其他回答

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

this.context.Database.CommandTimeout = 180;

如果你像我一样使用实体框架,你应该定义启动类超时如下:

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

这是我筹集的资金。也许它会对某人有所帮助:

我们开始吧:

如果你使用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和检查实体框架生成的选择语句。...

如果你正在使用DbContext,使用下面的构造函数来设置命令超时:

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

添加以下到我的存储过程,解决了超时错误由我:

SET NOCOUNT ON;
SET ARITHABORT ON;