【发布时间】:2015-05-07 06:19:07
【问题描述】:
我对存储过程和实体框架有疑问。
让我解释一下正在发生的事情......以及到目前为止我所做的尝试。
我有一个存储过程,它不会做很多事情
SELECT
COUNT(DISTINCT(EmailAddress)) AcceptedQuotes,
CONVERT (DATE,QuoteDate) QuoteDate
FROM
Quote Q
JOIN
Person P on Q.PersonPk = P.Pk
JOIN
Product Pr on Q.ProductPk = Pr.Pk
JOIN
Accepted A on Q.Pk = A.QuotePk
WHERE
QuoteDate between @startDate and @endDate
AND CompanyPk = @companyPk
AND FirstName != 'Test'
AND FirstName != 'test'
AND FirstName != 'EOH'
我想执行这个,它在 SSMS 中运行良好,甚至不需要 1 秒。
现在,我将其导入实体框架,它超时,我将命令超时设置为 120...
好的,到目前为止我已经尝试过什么以及我已经测试过什么。
如果我使用SqlCommand、SqlDataAdapter、DataTable 方式,以及我自己的连接字符串,它会按预期执行。当我在这种情况下使用实体框架连接字符串时,它会超时。
我更改了我的存储过程以包含“重新编译”选项,还尝试了SET ARITHABORT 方式,不走运,通过 EF 运行时超时。
这是 EF 中的错误吗?
我现在刚刚决定使用“老派”数据访问来重写它。
另请注意,EF 可以与来自同一数据库的其他存储过程一起正常执行。
任何想法或帮助将不胜感激......
附言。我找到了这篇文章,但也没有帮助:(
【问题讨论】:
-
你可以尝试更简单的查询,没有任何 where cluase,比如选择 TOP 1,看看你是否得到结果
-
你能发布你用来执行这个查询的代码吗?另外,尝试使用 sql server profiler 来查看幕后发生的事情。也许您在 EF 案例中为参数传递了错误的值?
-
好吧,我运行了分析器,EF 正在杀死数据库服务器。 CPU 30123,读取 1364453 什么鬼,这被更改为不使用带参数的 where 子句,只选择前 10 个
-
你能发布你从 sql profiler 捕获的查询吗?
-
嗨,好的,所以我创建了一个控制台应用程序,其中包含 edmx 文件,可以正常使用存储的 proc。当我引用一个带有 edmx 文件的程序集时,它就会死掉。我什至在另一个控制台应用程序中引用了有效的控制台应用程序......它死了。 exec [dbo].[spPartnerContacts] @startDate='2013-05-01 00:00:00',@endDate='2015-05-07 12:58:22',@companyPk=12
标签: c# sql-server entity-framework stored-procedures