在实体框架核心迁移中扩展命令超时

使用实体框架核心时执行的大多数迁移都很快就会直截了当 - 导致对数据库架构的调整不仅仅是一个。但是,有时,您可能还希望包含一个任务,该任务需要长于默认命令超时值(SQL Server中的30秒),例如导入大量数据。

Prior to version 2.0 of EF Core, your options were limited to changing the command timeout for the DbContext, running the migration and then resetting the timeout value (or not):

public SampleContext()
{
    Database.SetCommandTimeout((int)TimeSpan.FromMinutes(5).TotalSeconds);
}

The IDesignTimeDbContextFactory was introduced in EF Core 2.0 to alleviate this (and other) problems associated with configuring DbContext objects 不同于某些设计时任务,例如迁移。

该接口仅适用于设计时间工具,如 迁移。该工具配置为搜索包含该组件的组件 DbContext (或指定为启动程序集的人)的类型 implements the interface. If one exists, it is instantiated and its CreateDbContext method is called which returns the derived DbContext - 启用 您要以不同的方式配置上下文,以配置它的方式 用于运行时使用。因此,它提供了覆盖建筑的钩子 the DbContext type.

The following example illustrates the use of IDesignTimeDbContextFactory to override the creation of SampleContext, specifying a command timeout value of 10 几分钟,而不是默认30秒,或者任何价值 为上下文的运行时版本指定:

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);
    }
}

最后,您必须确保您的上下文有一个构造函数,它需要一个 DbContextOptions 对象作为参数:

public SampleContext(DbContextOptions options) : base(options) { }

应该在这个阶段注意到 string[] args parameter on the CreateDbContext method is not currently 实施的。决定尚未制定 如何将参数传递给此方法 通过各种设计时工具 发现实现界面的类型。