我正在使用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#代码定义。
答案 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
}