【发布时间】:2011-09-08 03:00:36
【问题描述】:
在使用需要超过 30 秒才能完成的函数导入时,我使用实体框架 (EF) 出现超时。我尝试了以下方法,但未能解决此问题:
我将Default Command Timeout=300000 添加到项目的App.Config 文件中的连接字符串中,该文件具有建议的here 的EDMX 文件。
这是我的连接字符串的样子:
<add
name="MyEntityConnectionString"
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
res://*/MyEntities.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
MultipleActiveResultSets=True;Default Command Timeout=300000;""
providerName="System.Data.EntityClient" />
我尝试像这样直接在我的存储库中设置 CommandTimeout:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
我还能做些什么来让 EF 避免超时?这只发生在非常大的数据集上。小型数据集一切正常。
这是我遇到的错误之一:
System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。
好的 - 我得到了这个工作,发生的事情很愚蠢。我将Default Command Timeout=300000 的连接字符串和CommandTimeout 设置为180。当我从连接字符串中删除Default Command Timeout 时,它起作用了。因此,答案是在您的上下文对象的存储库中手动设置 CommandTimeout,如下所示:
this.context.CommandTimeout = 180;
显然在连接字符串中设置超时设置对它没有影响。
【问题讨论】:
-
删除 "从连接字符串
-
@hamlin11 在 EF 连接字符串中,需要定义什么部分是连接字符串以及什么部分是 EF 元数据。将
&quot;留在字符串中。 -
我的建议是在增加超时之前先调查一下 EF 超时的原因。在我们的案例中,我们意识到我们需要为一些表添加
NONCLUSTERED索引,这为我们解决了超时问题。 -
我正在与 MS 支持部门合作解决 SQL 超时问题 - 这是当数据库托管在 SQL Azure 中时。我被告知所有 Azure PaaS 服务(PaaS 网站和 SQL Azure 等)都有 230 秒的通用超时,即使您手动设置了超时,这始终优先。这是为了保护多租户 PaaS 基础架构的资源。
标签: c# asp.net entity-framework entity-framework-4 connection-string