【问题标题】:How to set command timeout in aspnetcore/entityframeworkcore如何在 aspnetcore/entityframeworkcore 中设置命令超时
【发布时间】:2016-12-27 18:12:40
【问题描述】:

设置命令超时的地方已经和之前的版本不一样了。

但是,我找不到任何地方说明如何更改此设置。

我正在做的是上传非常大的文件,保存时间超过默认的 30 秒。

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

【问题讨论】:

标签: c# asp.net-core entity-framework-core


【解决方案1】:

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

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
    {
        Database.SetCommandTimeout(150000);
    }
}

【讨论】:

    【解决方案2】:

    更好的选择是在上下文设置期间使用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);
    }     
    

    注意:EF Core 只会执行少于 100 秒的查询。如果不止于此,它会不断重试,而您永远看不到结果。

    这是我目前的经验,如果你能解决它,请告诉我 EF Core 1.0 的超时速度甚至比 EF Core 2.0 还要快。

    【讨论】:

    • 这似乎不对。 EF Core 默认什么都不重试?
    【解决方案3】:

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

    在 Startup.ConfigureServices 中:

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

    【讨论】:

    • 这是最合理的方法,使用内置的配置API,配置解耦且易于更改,是负责配置的类的一部分。所有其他offets都是黑客攻击。
    【解决方案4】:

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

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

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

    Context.Database.SetCommandTimeout(TimeSpan.FromMinutes(20))
    

    使用作用域生命周期,您只能指定超时一次,并且您不必在任何后续服务构造函数注入中指定它。

    【讨论】:

    • 感谢您的回答,它专门解决了我对进行此类更改的生命周期的担忧。但是,我很好奇您如何知道SetCommandTimeout 中使用的值仅适用于通过 DI 提供的一个上下文,而不适用于该上下文的 每个 实例?您是否有参考文档来支持这一点?
    • 我应该把这条线放在哪里?在控制器 IActionResult 内部,在 dbContext 语句的使用内部,在 dbContext 的构造函数内部?
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2014-08-13
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 2019-09-20
      • 2023-03-22
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多