我将
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="
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;
显然,在连接字符串中设置超时设置对此没有影响。
#1 楼
在EF连接字符串中指定默认命令超时存在一个已知错误。http://bugs.mysql.com/bug.php?id=56806
删除连接字符串中的值并将其设置在数据上下文对象本身上。如果从连接字符串中删除有冲突的值,这将起作用。
Entity Framework Core 1.0:
this.context.Database.SetCommandTimeout(180);
Entity Framework 6:
this.context.Database.CommandTimeout = 180;
实体框架5:
((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;
实体框架4及以下:
this.context.CommandTimeout = 180;
评论
如何使用edmx实现此目的?
– iroel
2014年6月16日下午2:50
在哪个版本的EntityFramework中已修复?我找不到它的EF错误。
–入门者
15年3月31日在10:54
我不相信这是一个错误,而是设计使然,请参阅此处的“备注”链接
– Mick P
2015年5月19日晚上8:45
因为某些设置以毫秒为单位,而有些则以s为单位,所以我在这里进行了查找,CommandTimeout以秒为单位。
– JabberwockyDecompiler
2015年10月1日14:24
在Entity Framework 7中,可以在DbContext / IdentityDbContext的构造函数中进行设置:this.Database.SetCommandTimeout(180);
–托马斯·哈格斯特伦
16年5月18日在8:00
#2 楼
如果使用的是DbContext,请使用以下构造函数设置命令超时:public class MyContext : DbContext
{
public MyContext ()
{
var adapter = (IObjectContextAdapter)this;
var objectContext = adapter.ObjectContext;
objectContext.CommandTimeout = 1 * 60; // value in seconds
}
}
评论
@ErickPetru,因此您可以轻松地将其更改为其他分钟数:),如果编译器优化该乘法,我也不会感到惊讶!
–乔尔·韦尔哈根(Joel Verhagen)
13年4月30日在6:14
@JoelVerhagen,不要惊讶。这是自动优化发生时间的好解释:stackoverflow.com/questions/160848/…。在这种情况下,我想甚至会发生(因为它们是两个字面值),但老实说,我认为代码有点奇怪。
–埃里克·佩特鲁切利(Erick Petrucelli)
13年4月30日在18:20
嗯...孩子饿了...谁在乎1 * 60?
– Timmerz
13年7月17日在18:21
@ErikPetru,这实际上是非常普遍的做法,它使代码更具可读性。
–加尔文
2013年12月10日18:51
鉴于我的DbContext派生类是从edmx文件自动生成的,处理此问题的最佳方法是什么?
–马特·伯兰德
2014年7月30日15:21
#3 楼
如果您使用的是DbContext
和EF v6 +,也可以使用:this.context.Database.CommandTimeout = 180;
#4 楼
通常,我在交易中处理我的操作。据我所知,仅设置上下文命令超时是不够的,但是事务需要一个带有timeout参数的构造函数。我必须设置两个超时值才能使其正常工作。int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}
在函数结束时,我将命令超时设置为prevto中的前一个值。
使用EF6
评论
根本不是一个好方法。我曾经增加很多交易范围,这在我的项目中变成了噩梦。最终用EF 6+中的单个SAVEChanges()替换了所有事务范围。检查此coderwall.com/p/jnniww/…
–月亮
19年5月30日在16:13
这个答案应该有更高的投票权。我尝试了各种增加超时的方法,但是只有当我同时设置了上下文命令超时和事务作用域时,它才起作用。
– Gang
20-4-20在7:28
#5 楼
如果像我一样使用Entity Framework,则应按以下方式定义“启动时超时”类: services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));
#6 楼
我知道这是运行很旧的线程,但是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;
}
#7 楼
这就是我的资助。也许对某人有帮助:所以我们开始:
如果您将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并检查由以下项生成的Select语句实体框架。 …
#8 楼
在.Net Core(NetCore)中,使用以下语法将超时从默认的30秒更改为90秒:public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
this.Database.SetCommandTimeout(90); // <-- 90 seconds
}
}
#9 楼
将以下内容添加到我的存储过程中,由我解决了超时错误:SET NOCOUNT ON;
SET ARITHABORT ON;
#10 楼
对于Entity Framework 6,我使用此注释并可以正常工作。 public partial class MyDbContext : DbContext
{
private const int TimeoutDuration = 300;
public MyDbContext ()
: base("name=Model1")
{
this.Database.CommandTimeout = TimeoutDuration;
}
// Some other codes
}
CommandTimeout参数是可为空的整数,如果您将null设置为null或不设置,则将timeout
值设置为秒。设置它将使用您使用的提供程序的默认值
。
评论
Remove " from connection string还要参考这个stackoverflow.com/questions/4396833/sql-exception-with-net-4-ef
@hamlin11 In an EF connection string, that is required to define what part is connection string and what part is EF metadata. Leave " in the string.
我的建议是,在增加超时之前,请先进行调查,以了解EF为什么超时。在我们的案例中,我们意识到我们需要向某些表中添加NONCLUSTERED索引,这为我们解决了超时问题。
我正在与MS支持合作处理SQL超时问题-这是将数据库托管在SQL Azure中的时候。有人告诉我所有Azure PaaS服务(PaaS网站和SQL Azure等)的通用超时为230秒,即使您手动设置超时,该超时也始终优先。这是为了保护多租户PaaS基础架构的资源。