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

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)

  • 对于分配超时值,我更喜欢使用`TimeSpan`,所以意图很明确:`(int)TimeSpan.FromMinutes(20).TotalSeconds` (4认同)
  • 请注意这些是秒,因此这里设置的超时大约是两天. (2认同)
  • 注入连接字符串会很棒。 (2认同)

Pet*_*ter 9

您只能通过在调用Migrations方法之前在上下文中设置超时来设置迁移超时:

using (var context = new DispatchingDbContext(_configuration))
{
    context.Database.SetCommandTimeout(300);
    await context.Database.MigrateAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

设置迁移超时ef .netcore


Nis*_*nga 7

您也可以在数据库上下文类的构造函数中执行此操作。

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
    Database.SetCommandTimeout(150000);
}
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但它适用于一切,而不仅仅是迁移。似乎应该有一种方法可以将它仅应用于迁移。 (3认同)