SqlQuery上的实体框架超时

时间:2015-03-30 11:13:04

标签: c# sql-server entity-framework-6.1

我正在使用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正在执行存储的proc,参数正确 当我使用相同的参数在SSMS中运行存储过程时,我得到的结果不到1秒(从Profiler粘贴的副本是肯定的)。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

尝试将存储过程创建为

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

答案 1 :(得分:0)

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

{
        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