实体框架超时

Hal*_*yon 308 c# asp.net entity-framework connection-string entity-framework-4

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

我添加Default Command Timeout=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" />
Run Code Online (Sandbox Code Playgroud)

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

private TrekEntities context = new TrekEntities();

public IEnumerable<TrekMatches> GetKirksFriends()
{
    this.context.CommandTimeout = 180;
    return this.context.GetKirksFriends();
}
Run Code Online (Sandbox Code Playgroud)

我还能做些什么来让EF超时?这仅适用于非常大的数据集.小数据集一切正常.

这是我得到的错误之一:

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


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

this.context.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)

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

Che*_*hev 531

在EF连接字符串中指定默认命令超时存在已知错误.

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

从连接字符串中删除值并将其设置在数据上下文对象本身上.如果从连接字符串中删除冲突的值,这将起作用.

实体框架核心1.0:

this.context.Database.SetCommandTimeout(180);
Run Code Online (Sandbox Code Playgroud)

实体框架6:

this.context.Database.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)

实体框架5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)

实体框架4及以下:

this.context.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这是一个错误,而是设计,请参阅此处的备注部分[link](https://msdn.microsoft.com/en-us/library/system.data.entityclient.entitycommand.commandtimeout%28v = VS.90%29.aspx) (7认同)
  • 在Entity Framework 7中,您可以在DbContext/IdentityDbContext的构造函数中设置它:`this.Database.SetCommandTimeout(180);` (6认同)
  • 如何使用edmx实现这一目标? (5认同)
  • 因为有些设置是ms,有些是s,我查了一下[这里](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v = vs.110) ).aspx),CommandTimeout以秒为单位. (3认同)
  • 在哪个版本的EntityFramework中修复了这个问题?我找不到它的EF错误. (2认同)
  • 哇... 5 个版本的 EF 和 5 种设置 CommandTimeout 的方法。没有一个版本修复了 ConnectionString 中的问题? (2认同)

sai*_*lle 99

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

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

  • meh ......孩子们正在挨饿...谁在乎1*60? (30认同)
  • @ErikPetru,这实际上是一种非常常见的做法,使代码更具可读性. (7认同)
  • @ErickPetru,所以你可以很容易地将它改为不同的分钟数:),如果编译器优化了乘法,我也不会太惊讶! (3认同)
  • @JoelVerhagen,不要感到惊讶.以下是自动优化发生时的一个很好的解释:http://stackoverflow.com/questions/160848/net-multiplication-optimization.在这种情况下,我想即使发生(因为它们是两个字面值),但老实说,我认为代码有点奇怪. (2认同)

小智 39

如果您使用的是DbContextEF v6 +,您可以使用:

this.context.Database.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)


pil*_*oft 10

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

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

在函数结束时,我将命令超时设置为prevto中的先前值.

使用EF6


N-a*_*ate 10

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

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


Shi*_*a N 9

我知道这是一个非常古老的线程正在运行,但 EF 仍然没有修复这个问题。对于使用自动生成的人DbContext可以使用以下代码手动设置超时。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


par*_*uel 8

如果你像我一样使用实体框架,你应该在 Startup 类上定义超时,如下所示:

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