EF 迁移:创建 DbContext 实例

EF migrations: creating DbContext instance

是否可以"tell" 迁移如何创建 MyDbContext 实例?默认情况下,它使用 public 无参数构造函数并在 AppConfig 中搜索与 MyDbContext class 相同的连接字符串。我能以某种方式告诉配置迁移使用一些工厂方法来创建 MyDbContext 实例,它将用于迁移吗?

我不知道如何使用 DbContext 的无参数构造函数进行迁移,但我会使用我的配置 class 和我的 Initializer 来注入一些连接字符串。或许能帮到你。

public class MyDbInitializer : IDatabaseInitializer<MyDbContext>
{
    private readonly DbMigrationsConfiguration _configuration;

    public MyDbInitializer(string connection)
    {
        _configuration = new Configuration(connection);
    }

    public void InitializeDatabase(MyDbContext context)
    {
        if (!context.Database.Exists())
        {
            context.Database.Create();
        }
        else
        {
            var migrator = new DbMigrator(_configuration);
            if (migrator.GetPendingMigrations().Any())
                migrator.Update();
        }
    }
}

internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration(string connectionString)
    {
        this.TargetDatabase = new System.Data.Entity.Infrastructure.DbConnectionInfo(connectionString);
        AutomaticMigrationsEnabled = true;
        ContextKey = "MyProj.Models.MyDbContext";
    }
}

public MyDbContext()
{

}

public MyDbContext(string connection)
{
   Database.SetInitializer(new MyDbInitializer(connection));
}

您可以创建一个 class 来实现 IDbContextFactory<MyDbContext> 接口并包含用于创建 MyDbContext 实例的自定义代码。

设计时工具和迁移工具将自动发现此 class(如果它与您的 DbContext 位于同一程序集中)并将使用它来初始化 MyDbContext.

public class MigrationsContextFactory : IDbContextFactory<MyDbContext> {
    public MyDbContext Create() {
        return new MyDbContext(connectionString, someOtherSettings);
    }
}

参考documentation