实体框架超时
当使用需要30秒才能完成的功能导入时,我使用实体框架(EF)获取超时。 我尝试了以下方法,但无法解决此问题:
按照此处所建议的,将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;
显然,在连接字符串中设置超时设置对它没有影响。
有一个已知的错误,指定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;
如果您正在使用DbContext,请使用以下构造函数来设置命令超时:
public class MyContext : DbContext
{
public MyContext ()
{
var adapter = (IObjectContextAdapter)this;
var objectContext = adapter.ObjectContext;
objectContext.CommandTimeout = 1 * 60; // value in seconds
}
}
如果您使用的是DbContext
和EF v6 +,或者您可以使用:
this.context.Database.CommandTimeout = 180;
链接地址: http://www.djcxy.com/p/33563.html