一尘不染

实体框架超时

c#

使用功能导入需要超过30秒才能完成时,使用实体框架(EF)导致超时。我尝试了以下操作,但无法解决此问题:

Default Command Timeout=300000这里建议的具有EDMX文件的项目的
App.Config
文件中添加了连接字符串。

这是我的连接字符串如下所示:

<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;

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


阅读 218

收藏
2020-05-19

共1个答案

一尘不染

在EF连接字符串中指定默认命令超时存在一个已知的错误。

http://bugs.mysql.com/bug.php?id=56806

从连接字符串中删除该值,并将其设置在数据上下文对象本身上。如果您从连接字符串中删除冲突的值,这将起作用。

实体框架核心1.0:

this.context.Database.SetCommandTimeout(180);

实体框架6:

this.context.Database.CommandTimeout = 180;

实体框架5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

实体框架4及以下版本:

this.context.CommandTimeout = 180;
2020-05-19