实体框架不遵守命令超时

Posted

技术标签:

【中文标题】实体框架不遵守命令超时【英文标题】:Entity Framework not respecting Command Timeout 【发布时间】:2017-09-13 09:48:38 【问题描述】:

我在使用基于实体框架的 API 时遇到了问题,其中第 3 方开发人员错误地发送了太大的查询并导致系统性能下降。我已通知他们停止练习,但我想将查询限制为 1 分钟,然后将其切断。

听起来我应该能够在构造函数中设置命令超时(如下所示)。当我使用长查询对其进行测试时,它完全按照以前(3 分钟以上)的方式执行查询,它似乎根本不尊重命令超时。

我做错了吗?这不是命令超时预期的工作方式吗?它是异步的,命令超时是否不适用于异步?任何解决方案或指针将不胜感激。

public class CustomContext : DbContext

    public CustomContext(string connectionName)
        : base(connectionName)
    
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = 60;
    

    public CustomContext(EntityConnection connection)
        : base(connection, contextOwnsConnection: false)
    
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = 60;
    

【问题讨论】:

一方面,您可以使用this.Database.CommandTimeout。根据我的经验(Sql Server),它可以正常工作。你确定是SQL命令需要很长时间吗?之后也可以在内存中处理。 【参考方案1】:

检查一下:

实体框架 6:

this.context.Database.CommandTimeout = 180;

实体框架 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4 及以下:

this.context.CommandTimeout = 180;

【讨论】:

以上是关于实体框架不遵守命令超时的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架在数据库上执行命令

Execution Timeout Expired - 随机用于简单的更新命令

如何通过用户定义的代码为实体框架使用迁移命令

不遵守 Azure Pipelines 任务超时

实体框架超时

优化实体框架查询 - 超时已过期