如何设置Entity Framework Core迁移的超时时间?
问题的原因是在进行Entity Framework Core迁移时,可能会遇到超时问题。解决方法是在调用迁移方法之前设置上下文的超时时间。具体的代码示例如下:
using (var context = new DispatchingDbContext(_configuration)) { context.Database.SetCommandTimeout(300); await context.Database.MigrateAsync().ConfigureAwait(false); }
你可以将这段代码放在需要进行迁移的地方。
参考链接:[Set timeout for migrations ef .netcore](https://pgroene.wordpress.com/2017/12/05/set-custom-timeout-for-code-first-migrations-entity-framework-core-2-0)
问题的原因是在使用Entity Framework Core迁移时出现了命令超时,而不是连接超时。
自EF Core 2.0以来,您可以使用IDesignTimeDbContextFactory
在设计时更改上下文的行为,例如迁移工具创建上下文时。
在项目中创建一个实现IDesignTimeDbContextFactory
接口的单独类,并使用DbContextOptionsBuilder
配置所需的行为,例如将命令超时值设置为600秒:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; namespace EFCoreSample.Model { public class SampleContextFactory : IDesignTimeDbContextFactory{ public SampleContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder (); optionsBuilder.UseSqlServer(@"Server=.\;Database=db;Trusted_Connection=True;", opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds)); return new SampleContext(optionsBuilder.Options); } } }
确保现有的DbContext
具有以DbContextOptions
对象作为参数的构造函数:
public AdventureContext(DbContextOptions options) : base(options){}
当迁移工具运行迁移时,首先会查找一个实现了IDesignTimeDbContextFactory
的类,并在配置上下文时使用它。运行时行为不受影响。
旧的答案不再适用:
无法在使用EF命令时设置上下文的CommandTimeout
。但是,您可以在构造函数中全局设置它,然后在不需要时将其删除:
public class ApplicationDbContext : DbContext { public ApplicationDbContext() { Database.SetCommandTimeout(150000); } }
创建问题以询问是否允许针对迁移设置特定的超时:github.com/aspnet/EntityFramework/issues/6613(请注意,这里的超时是以秒为单位,因此此处设置的超时约为两天)。
如果有办法仅在迁移时增加超时时间,例如if (IsMigrations()) { Database.SetCommandTimeout(1500) }
,我是否可以使用任何条件进行设置?
我不知道有没有这种方法,但是我最近没有关注EF Core的最新动态。
如果您使用的是EF Core(>2.0),并且要将超时时间应用于CLI迁移(例如dotnet ef database update
),那么您可以在IDesignTimeDbContextFactory
或Program.BuildWebHost
中控制上下文对象的创建方式(更多信息请参见这里)。如果您是以编程方式进行设置,则需要自己创建一个上下文对象。只需向上下文添加一个构造函数参数(具有默认值)即可。
对于分配超时值,我更喜欢使用TimeSpan
,以便意图清晰明了:(int)TimeSpan.FromMinutes(20).TotalSeconds
。
这还适用于全局吗?我通常希望在维护类型作业中使用较长的超时时间,而不是在普通的CRUD操作中使用。这真的很奇怪。这种依赖注入有时确实会带来麻烦。
正如Pace在他的评论中提到的那样,现在已经有了解决方案。我已经更新了答案以提供一个示例。
如果您有主机构建器,则"$ dotnet ef"将使用它来配置上下文。
我通过从appsettings文件中读取连接字符串改进了Mike Brind的答案。请参见下面的答案。
设置Entity Framework Core迁移超时时间的方法是在数据库上下文类的构造函数中设置。代码如下:
public ApplicationDbContext(DbContextOptionsoptions) : base(options) { Database.SetCommandTimeout(150000); }
这种方法可以设置整个数据库上下文的超时时间,而不仅仅是迁移操作。如果只想设置迁移操作的超时时间,可以将超时时间赋值给`Database.CommandTimeout`属性。代码如下:
Database.CommandTimeout = 150000;
感谢提供帮助的人,这个方法很有帮助。