C# 如何设置实体框架核心迁移超时?

C# 如何设置实体框架核心迁移超时?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我使用的是EF Core的最新(1.0.0)版本。我要在一个相当大的数据库上运行迁移 我运行: dotnet ef数据库更新-c ApplicationDbContext 并获得: 超时已过期。完成之前的超时时间 操作或服务器没有响应 在连接字符串中,我显式设置超时,如下所示: 连接超时=150000 不幸的是,这没有帮助。我应该如何执行此操作?您收到的错误消息是命令超时,而不是连接超时 更新 正如在评论中提到的,由于EF Core 2.0,您可以使用IDesignTimeDbContextFa

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

我运行:

dotnet ef数据库更新-c ApplicationDbContext

并获得:

超时已过期。完成之前的超时时间 操作或服务器没有响应

在连接字符串中,我显式设置超时,如下所示:

连接超时=150000


不幸的是,这没有帮助。我应该如何执行此操作?

您收到的错误消息是命令超时,而不是连接超时

更新

正如在评论中提到的,由于EF Core 2.0,您可以使用
IDesignTimeDbContextFactory
在设计时通过工具创建上下文时更改上下文的行为,例如迁移

在项目中创建一个单独的类,该类实现
IDesignTimeDbContextFactory
接口,并使用
DBContextOptions Builder
配置所需的行为-在这种情况下,将命令超时值设置为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);
        }
    }
}
当工具运行迁移时,它首先查找实现
IDesignTimeDbContextFactory
的类,如果找到,将使用该类配置上下文。运行时行为不受影响

原始答案不再适用

使用EF命令时,无法在上下文上设置
命令超时。但您可以在构造函数中全局设置它,如果不需要保留它,则可以稍后将其删除:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
    {
        Database.SetCommandTimeout(150000);
    }
}
使用EntityFramework6(而不是CORE!),我使用
DbMigrationsConfiguration.CommandTimeout
属性为迁移设置了更长的超时时间

像这样:

在my Global.asax.cs中:

protected void Application_Start()
{
    DatabaseMigrationConfig.Register();
    //etc
}
My
DatabaseMigrationConfig
Class:

public class DatabaseMigrationConfig
{
    internal static void Register()
    {
        using (var context = new MyContext(Config.ConnectionStringMigrations))
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext,
                                        Migrations.Configuration>());
            context.Database.Initialize(false);
        }
    }
}
参考资料:


请注意,我在迁移期间也使用了不同的连接字符串-用户的权限高于网站,并且连接超时更长。请参阅此问题-

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

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

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

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
    Database.SetCommandTimeout(150000);
}
public ApplicationDbContext(DbContextOptions)
:基本(选项)
{
数据库.SetCommandTimeout(150000);
}

您确定,您的答案对Entity Framework CORE有效吗?我不确定,因为我没有使用它,但我认为很容易检查我是否已下载并正在使用它。您是说已从Core中删除了
dbmigtorinsconfiguration.CommandTimeout
?EF Core中没有dbmigtorinsconfiguration。它已被删除。答案很好,但请指定它是针对“Entity Framework 6(非核心)”的,因为人们会感到困惑:)请注意,这些是秒,因此此处设置的超时约为两天。作为一种解决方法,我是否可以使用任何条件来增加仅用于迁移的超时?像
if(IsMigrations()){Database.SetCommandTimeout(1500)}
分配超时值一样,我更喜欢使用
TimeSpan
,目的很清楚:
(int)TimeSpan.frommins(20).TotalSeconds
@Simon\u Weaver正如他在评论中提到的那样,现在有了一个解决方案。我已经更新了答案以提供一个示例。不过,插入连接字符串会很好。这是可行的,但它适用于所有情况,而不仅仅是迁移。似乎应该有一种方法将其仅应用于迁移。谢谢,这很有帮助,只是您将其设置为属性而不是函数:Database.CommandTimeout=150000;
using (var context = new DispatchingDbContext(_configuration))
{
    context.Database.SetCommandTimeout(300);
    await context.Database.MigrateAsync().ConfigureAwait(false);
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
    Database.SetCommandTimeout(150000);
}