如何在aspnetcore/entityframeworkcore中设置命令超时

Gre*_*Gum 28 c# entity-framework-core asp.net-core

设置命令超时的位置不再与早期版本相同.

但是,我找不到任何说明如何改变它的地方.

我正在做的是上传非常大的文件,这需要超过默认的30秒保存.

请注意,我在另一个问题中询问命令超时,而不是迁移超时.

Car*_*man 59

如果您正在使用DI容器来管理DbContext(即您正在将DbContext添加到服务集合中),则可以在选项中指定命令超时.

在Startup.ConfigureServices中:

services.AddDbContext<YourDbContext>(options => options.UseSqlServer(
    this.Configuration.GetConnectionString("YourConnectionString"),
    sqlServerOptions => sqlServerOptions.CommandTimeout(60))
);
Run Code Online (Sandbox Code Playgroud)

  • 这是最合理的方法,使用内置的配置API,配置是解耦的并且易于更改,是负责配置的类的一部分。所有其他偏移都是黑客行为。 (6认同)
  • @Aileron79,提供的示例使用 Entity Framework Core,而不是 Entity Framework 6。 (2认同)

小智 23

你可以通过你的上下文来改变它

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
    {
        Database.SetCommandTimeout(150000);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*sim 18

在 EF Core 3 及更高版本中,您现在可以通过连接字符串进行配置。但您需要从 'System.Data.SqlClient' 迁移'Microsoft.Data.SqlClient'

将System.Data.SqlClient替换为Microsoft.Data.SqlClient 版本 2.1.0或更高版本。

然后在连接字符串中简单地附加命令超时,如下所示:

"Data Source=SqlExpress;Initial Catalog=YourDatabase;Integrated Security=true;Command Timeout=300"
Run Code Online (Sandbox Code Playgroud)

这仅适用于Microsoft.Data.SqlClient 2.1.0 或更高版本,如果您使用 System.Data.SqlClient 尝试此操作,则会出现异常。

  • 请注意 4.0 重大更改,Encrypt=true 现在是默认值,在此之前,System..SqlClient 默认情况下不会尝试对 mssql 连接使用 TLS。https://github.com/dotnet/SqlClient/blob/main/CHANGELOG.md#preview-release-400-preview1212372---2021-08-25 (2认同)

小智 7

CommandTimeout更好的选择是在上下文设置期间使用,例如:

public class DbConnect: IConnnectDb
{
    private dbentitient _context;

    // inject this to a db entity from constructor. 

    //inside each method now use the follow before u actually run the query to db.  

    _context.Database.SetCommandTimeout(400);
}     
Run Code Online (Sandbox Code Playgroud)

注意:EF Core 只会执行时间小于 100 秒的查询。如果超过这个值,它会不断重试,而您永远看不到结果。

这是我目前的经验,所以如果您能够修复它,请告诉我 EF Core 1.0 的超时速度甚至比 EF Core 2.0 更快。


Ole*_*leg 7

如果您只想为一个 Context 实例临时增加超时。

假设 1 个请求(默认的 Scoped 上下文生命周期)

在长时间运行的查询之前更改此设置:

Context.Database.SetCommandTimeout(TimeSpan.FromMinutes(20))
Run Code Online (Sandbox Code Playgroud)

使用范围生命周期,您可以只指定一次超时而不必在任何后续服务构造函数注入中指定它。