如何设置Entity Framework Core迁移的超时时间?

22 浏览
0 Comments

如何设置Entity Framework Core迁移的超时时间?

我正在使用最新的EF Core(1.0.0)版本。我需要在一个相当大的数据库上运行一个迁移。

我运行了以下命令:

dotnet ef database update -c ApplicationDbContext

然后得到了如下的错误信息:

超时已过期。在操作完成之前超时期限已到或服务器未响应。

在连接字符串中,我明确设置了超时时间,如下所示:

Connect Timeout=150000

不幸的是,这并没有起作用。我应该怎么做?

0
0 Comments

问题的原因是在进行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)

0
0 Comments

问题的原因是在使用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),那么您可以在IDesignTimeDbContextFactoryProgram.BuildWebHost中控制上下文对象的创建方式(更多信息请参见这里)。如果您是以编程方式进行设置,则需要自己创建一个上下文对象。只需向上下文添加一个构造函数参数(具有默认值)即可。

对于分配超时值,我更喜欢使用TimeSpan,以便意图清晰明了:(int)TimeSpan.FromMinutes(20).TotalSeconds

这还适用于全局吗?我通常希望在维护类型作业中使用较长的超时时间,而不是在普通的CRUD操作中使用。这真的很奇怪。这种依赖注入有时确实会带来麻烦。

正如Pace在他的评论中提到的那样,现在已经有了解决方案。我已经更新了答案以提供一个示例。

如果您有主机构建器,则"$ dotnet ef"将使用它来配置上下文。

我通过从appsettings文件中读取连接字符串改进了Mike Brind的答案。请参见下面的答案。

0
0 Comments

设置Entity Framework Core迁移超时时间的方法是在数据库上下文类的构造函数中设置。代码如下:

public ApplicationDbContext(DbContextOptions options)
    : base(options)
{
    Database.SetCommandTimeout(150000);
}

这种方法可以设置整个数据库上下文的超时时间,而不仅仅是迁移操作。如果只想设置迁移操作的超时时间,可以将超时时间赋值给`Database.CommandTimeout`属性。代码如下:

Database.CommandTimeout = 150000;

感谢提供帮助的人,这个方法很有帮助。

0