使用自定义连接字符串的EF 6程序化迁移

3

我有一个启用了迁移并具有单个初始迁移的EF6代码优先实现。我创建了一个方法来以编程方式运行迁移,如下所示:

public void RunMigration()
{
    var migrationConfiguration = new DataAccess.Migrations.Configuration();
    var migrator = new System.Data.Entity.Migrations.DbMigrator(migrationConfiguration);
    migrator.Update();
}

当我进行测试时,我在App.config中有几个配置好的连接字符串。我的问题是:

我如何告诉DbMigrator使用哪个连接字符串?

更新: 我想这个难点在于不扩展DbMigrator的情况下完成此操作。


我猜查看EF7如何处理这个问题对我也会有帮助,因为我很快也要在那里复制这个。 - AC4
连接与目标 DbContext 相同。 - Fals
当然可以,但是没有公开的方法可以使用不同的连接发送dbContext。我发现一个有用的内部构造函数。不确定将以下DbMigrator构造函数内部化的原因是什么:internal DbMigrator(DbMigrationsConfiguration configuration, DbContext usersContext)看起来好像没有办法只使用该类,我需要创建一个具体的实现。 - AC4
既然我已经开始使用DbMigrator,我想要使用的所有内容都是内部的,因此扩展该类似乎并不是意图之一。 - AC4
5个回答

3

我使用

var migrator = new DbMigrator(new DbMigrationsConfiguration { TargetDatabase = new DbConnectionInfo("MyConnectionStringHere")});
migrator.Update();

2

所以,除非有更好的答案:在EF6中,截至EF 6.1.3版本,没有有效的方法可以为编程式数据库迁移指定运行时连接字符串。 我认为我能想到的唯一方法是生成一个SQL脚本,并在数据库设置时以编程方式运行它。 这样做的问题是我要么必须编译文本,要么随二进制文件一起部署。


1
您可以设置dbConnectionInfo:
migrationConfiguration.TargetDatabase = new DbConnectionInfo(connectionString);

完整代码:

public void RunMigration(string connectionString)
{
    var migrationConfiguration = new DataAccess.Migrations.Configuration();
migrationConfiguration.TargetDatabase = new DbConnectionInfo(connectionString);
    var migrator = new System.Data.Entity.Migrations.DbMigrator(migrationConfiguration);
    migrator.Update();
}

重要提示:在dbContext初始化器中,请勿设置连接名称。


1

看起来你需要将migrationConfiguration.TargetDatabase设置为一个DbConnectionInfo

DbConnectionInfo的构造函数之一接受一个连接字符串。 请参阅 MSDN

实际上,使用这个方法最简单的方式是修改你的DataAccess.Migrations.Configuration类,使用带有连接字符串的构造函数。


2
虽然听起来很简单,但我仍然遇到了找不到默认命名的连接字符串的错误。 - AC4
今晚当我回到电脑前,我会进行一些测试,看看能否让某些东西运作起来。 - Bradley Uffner

0
我最近需要做这个,我的解决方案是创建一个自定义的配置类。整个代码库对我来说完美运行。
    public class Configuration : DbMigrationsConfiguration<Context>
{
    public void Init()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;            
    }
    public Configuration()
    {
        Init();
    }

    protected override void Seed(Context context)
    {
        //  This method will be called after migrating to the latest version.
        //  You can use the DbSet<T>.AddOrUpdate() helper extension method
        //  to avoid creating duplicate seed data.
    }
    public static void UpdateDatabase()
    {
        try
        {
            var config = new Configuration();
            UpdateDatabase(config);
        }
        catch (Exception ex)
        {
            logger.writeLog("UpdateDatabase", ex);
        }
    }

    public Configuration(DbConnectionInfo db)
    {
        Init();
        TargetDatabase = db;
    }
    public static void UpdateDatabase(DbConnectionInfo db)
    {
        try
        {
            var config = new Configuration(db);
            UpdateDatabase(config);
        }
        catch (Exception ex)
        {
            logger.writeLog("UpdateDatabase", ex);
        }
    }
    private static void UpdateDatabase(Configuration config)
    {
        var migrator = new DbMigrator(config);
        var pending = migrator.GetPendingMigrations();
        if (pending.Count() > 0)
            migrator.Update();
    }
}

}

这提供了一个默认选项,它使用在DataContext中指定的连接字符串,同时也提供了传递连接的选项。
默认调用
Configuration.UpdateDatabase();

使用传递连接信息来覆盖
var offlineCon = new System.Data.Entity.Infrastructure.DbConnectionInfo("connection string","provider");
Configuration.UpdateDatabase(offlineCon);

连接字符串是您特定的连接字符串,提供程序是数据提供程序,例如System.Data.SqlClient。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接