Entity Framework SQLQuery 超时

Entity Framework Timeouts on SqlQuery

我正在使用 EF 6.1.3,并且使用其中一个存储过程填充模型超时。

var spResult = context.Stuff.SqlQuery("exec GetStuff @p0, @p2", pId, typeId )
.OrderBy(a => a.Barcode)
.ToDataSourceResult(request);

我有一个名为 GetStuff 的存储过程,它有两个参数:@id int@typeId int = null //nullable

在 SQL Profiler 中,我可以看到服务器上的 EF 正在执行存储过程,参数正确。
当我 运行 使用相同参数在 SSMS 中存储过程时,我会在不到 1 秒的时间内得到结果(确保从 Profiler 复制粘贴)。

如果我在从 EF 调用时更改一个参数,我会立即得到结果!

简而言之:存储过程 GetStuff (1, null) 在 EF 和 SSMS 中工作,而 GetStuff(1, 1) 在 EF 中超时,但在 SSMS 中工作。

存储过程只是一个 Select,在 SQL 或我的 C# 代码中没有定义事务。

将此代码添加到您的上下文中class

{
        Database.SetInitializer<yourDatabaseContextName>(null);
        var adapter = (System.Data.Entity.Infrastructure.IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        objectContext.CommandTimeout = 120; //2 minutes
    }

click this for more information

这看起来像是参数嗅探问题,请参阅 simple talk article

尝试将存储过程创建为

CREATE PROCEDURE GetStuff
  @pid INT,
  @typId INT
WITH RECOMPILE
AS
 ....