Entity Framework 超时问题

391

我在使用实体框架(EF)时,当使用一个需要超过30秒才能完成的函数导入时,会出现超时问题。我尝试了以下方法,但无法解决这个问题:

我按照这里建议,在包含EDMX文件的项目的App.Config文件中的连接字符串中添加了Default Command Timeout=300000

这是我的连接字符串:

<add 
    name="MyEntityConnectionString" 
    connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
       res://*/MyEntities.msl;
       provider=System.Data.SqlClient;provider connection string=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    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;

显然,在连接字符串中设置超时设置对其没有影响。


从连接字符串中删除“”。 - Brian Webster
请参考以下内容,关于.NET 4 EF中的SQL异常问题,请点击此链接:https://dev59.com/9VLTa4cB1Zd3GeqPbIaN - Saif Khan
5
在 EF 连接字符串中,需要明确定义哪部分是连接字符串,哪部分是 EF 元数据。请在字符串中保留 &quot; - Chev
2
我的建议是,在增加超时时间之前,先调查一下为什么 EF 会超时。在我们的情况下,我们意识到需要向一些表添加“NONCLUSTERED”索引,这解决了我们的超时问题。 - zulucoda
我正在与微软支持团队一起解决SQL超时问题 - 当数据库托管在SQL Azure中时会出现此问题。我被告知,在所有Azure PaaS服务(PaaS网站和SQL Azure等)中,存在一个普遍的230秒超时时间限制,即使您手动设置超时时间,该限制也始终具有优先权。这是为了保护多租户PaaS基础架构的资源。 - Ian Robertson
11个回答

0
将以下代码添加到我的存储过程中,解决了超时错误:

以下代码添加到我的存储过程中,解决了超时错误:

SET NOCOUNT ON;
SET ARITHABORT ON;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接