EF迁移:创建DbContext实例

时间:2015-10-19 18:52:45

标签: entity-framework entity-framework-6 ef-migrations

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

2 个答案:

答案 0 :(得分:2)

我不知道如何使迁移使用DbContext的无参数构造函数,但我会使用我的配置类和我的初始化程序来注入一些连接字符串。也许它可以帮助你。

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

答案 1 :(得分:2)

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

设计时工具以及迁移工具会自动发现此类(如果它与您的DbContext放在同一个程序集中),并将使用它来初始化MyDbContext

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

请参阅documentation以供参考。