entity framework超时

我使用entity framework(EF)超时使用function导入,需要超过30秒才能完成。 我尝试了以下,并没有能够解决这个问题:

按照此处的build议,将EDMX文件的项目中的App.Config文件中的连接string添加为Default Command Timeout=300000

这是我的连接string看起来像:

 <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:超时过期。 操作完成之前超时的时间或服务器没有响应。


好的 – 我得到了这个工作,发生了什么事情很愚蠢。 我有两个连接string与Default Command Timeout=300000和CommandTimeout设置为180.当我从连接string中删除Default Command Timeout ,它的工作。 所以答案是在你的上下文对象上手动设置你的仓库中的CommandTimeout如下所示:

 this.context.CommandTimeout = 180; 

显然在连接string中设置超时设置对它没有影响。

有一个已知的错误,指定EF连接string内的默认命令超时。

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

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

entity framework核心1.0:

 this.context.Database.SetCommandTimeout(180); 

entity framework6:

 this.context.Database.CommandTimeout = 180; 

entity framework5:

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

entity framework4及以下:

 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; 

通常我在一个事务中处理我的操作。 正如我所经历的,设置上下文命令超时是不够的,但事务需要一个带有超时参数的构造函数。 我必须设置两个超时值才能正常工作。

 int? prevto = uow.Context.Database.CommandTimeout; uow.Context.Database.CommandTimeout = 900; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) { ... } 

在函数结束时,我将命令超时设置回prevto中的前一个值。

使用EF6

这是我的资金。 也许这对别人有帮助:

所以在这里我们去:

如果您使用LINQ与EF查找列表中包含的一些确切的元素,如下所示:

 await context.MyObject1.Include("MyObject2").Where(t => IdList.Contains(t.MyObjectId)).ToListAsync(); 

一切正常,直到IdList包含多个Id。

如果列表只包含一个Id,则会出现“超时”问题。 要解决这个问题,使用if条件来检查IdList中的id号。

例:

 if (IdList.Count == 1) { result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.FirstOrDefault()==t. MyObjectId).ToListAsync(); } else { result = await entities. MyObject1.Include("MyObject2").Where(t => IdList.Contains(t. MyObjectId)).ToListAsync(); } 

说明:

只需尝试使用Sql Profiler并检查Entity frameeork生成的Select语句。 …

我知道这是非常古老的线程运行,但仍然没有解决这个EF。 对于使用自动生成的DbContext用户,可以使用以下代码手动设置超时值。

 public partial class SampleContext : DbContext { public SampleContext() : base("name=SampleContext") { this.SetCommandTimeOut(180); } public void SetCommandTimeOut(int Timeout) { var objectContext = (this as IObjectContextAdapter).ObjectContext; objectContext.CommandTimeout = Timeout; }