And*_*Gis 20 c# entity-framework entity-framework-core
我正在使用最新的(1.0.0)版本的EF Core.我有一个迁移到一个相当大的数据库上运行.
我跑:
dotnet ef数据库更新-c ApplicationDbContext
得到:
超时已过期.操作完成之前经过的超时时间或服务器没有响应.
在连接字符串中,我明确地设置了超时,如下所示:
连接超时= 150000
不幸的是,它没有帮助.我该怎么做?
Mik*_*ind 34
您获得的错误消息是命令超时,而不是连接超时.
UPDATE
正如Pace在评论中所提到的,自从EF Core 2.0以来,您可以使用它IDesignTimeDbContextFactory来改变上下文的行为,当它在设计时通过工具创建时,例如迁移时发生.
在项目中创建一个实现IDesignTimeDbContextFactory接口的单独类,并使用它DbContextoptionsBuilder来配置所需的行为 - 在这种情况下,将命令超时值设置为600秒:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace EFCoreSample.Model
{
public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
public SampleContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
optionsBuilder.UseSqlServer(@"Server=.\;Database=db;Trusted_Connection=True;", opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));
return new SampleContext(optionsBuilder.Options);
}
}
}
Run Code Online (Sandbox Code Playgroud)
确保现有DbContext的构造函数将DbContextOptions对象作为参数:
public AdventureContext(DbContextOptions options) : base(options){}
Run Code Online (Sandbox Code Playgroud)
当工具运行迁移时,它首先查找实现的类,IDesignTimeDbContextFactory如果找到,将使用它来配置上下文.运行时行为不受影响.
原始答案不再适用
CommandTimeout使用EF命令时无法设置上下文.但是您可以在构造函数中全局设置它,如果您不需要保留它,则稍后将其删除:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
Database.SetCommandTimeout(150000);
}
}
Run Code Online (Sandbox Code Playgroud)
您只能通过在调用Migrations方法之前在上下文中设置超时来设置迁移超时:
using (var context = new DispatchingDbContext(_configuration))
{
context.Database.SetCommandTimeout(300);
await context.Database.MigrateAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
您也可以在数据库上下文类的构造函数中执行此操作。
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
Database.SetCommandTimeout(150000);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14777 次 |
| 最近记录: |