Hal*_*yon 308 c# asp.net entity-framework connection-string entity-framework-4
当使用需要超过30秒才能完成的函数导入时,我将使用实体框架(EF)获得超时.我尝试了以下操作,但无法解决此问题:
我添加Default Command Timeout=300000到项目中App.Config文件中的连接字符串,该文件具有此处建议的EDMX文件.
这是我的连接字符串的样子:
<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" />
Run Code Online (Sandbox Code Playgroud)
我尝试直接在我的存储库中设置CommandTimeout,如下所示:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Run Code Online (Sandbox Code Playgroud)
我还能做些什么来让EF超时?这仅适用于非常大的数据集.小数据集一切正常.
这是我得到的错误之一:
System.Data.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常 ---> System.Data.SqlClient.SqlException:超时已过期.操作完成之前经过的超时时间或服务器没有响应.
好的 - 我得到了这个工作,发生了什么事很愚蠢.我有连接字符串Default Command Timeout=300000和CommandTimeout设置为180.当我Default Command Timeout从连接字符串中删除它,它工作.所以答案是在上下文对象的存储库中手动设置CommandTimeout,如下所示:
this.context.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)
显然在连接字符串中设置超时设置对它没有影响.
Che*_*hev 531
在EF连接字符串中指定默认命令超时存在已知错误.
http://bugs.mysql.com/bug.php?id=56806
从连接字符串中删除值并将其设置在数据上下文对象本身上.如果从连接字符串中删除冲突的值,这将起作用.
this.context.Database.SetCommandTimeout(180);
Run Code Online (Sandbox Code Playgroud)
this.context.Database.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)
((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)
this.context.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)
sai*_*lle 99
如果您使用的是DbContext,请使用以下构造函数来设置命令超时:
public class MyContext : DbContext
{
public MyContext ()
{
var adapter = (IObjectContextAdapter)this;
var objectContext = adapter.ObjectContext;
objectContext.CommandTimeout = 1 * 60; // value in seconds
}
}
Run Code Online (Sandbox Code Playgroud)
小智 39
如果您使用的是DbContextEF v6 +,您可以使用:
this.context.Database.CommandTimeout = 180;
Run Code Online (Sandbox Code Playgroud)
pil*_*oft 10
通常我会在交易中处理我的操作.正如我所经历的那样,设置上下文命令超时是不够的,但是事务需要一个带有timeout参数的构造函数.我必须设置两个超时值才能正常工作.
int? prevto = uow.Context.Database.CommandTimeout;
uow.Context.Database.CommandTimeout = 900;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(900))) {
...
}
Run Code Online (Sandbox Code Playgroud)
在函数结束时,我将命令超时设置为prevto中的先前值.
使用EF6
N-a*_*ate 10
在.NET Core中,使用以下语法将超时从默认的 30 秒更改为 90 秒:
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
this.Database.SetCommandTimeout(90); // <-- 90 seconds
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一个非常古老的线程正在运行,但 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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你像我一样使用实体框架,你应该在 Startup 类上定义超时,如下所示:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), o => o.CommandTimeout(180)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
266094 次 |
| 最近记录: |