我在使用实体框架(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="
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;
显然,在连接字符串中设置超时设置对其没有影响。
"
。 - Chev