使用自定义连接字符串进行 EF 6 编程迁移

问题描述 投票:0回答:5

我有一个 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 的情况下完成此操作。

c# .net entity-framework entity-framework-6 .net-4.5
5个回答
3
投票

我用

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

2
投票

因此,除非有人提出更好的答案:在 EF6 中,从 EF 6.1.3 开始,没有工作方法可以为编程数据库迁移指定运行时连接字符串。我认为我唯一能看到的是我需要生成一个 sql 脚本并在数据库设置时以编程方式运行它。问题是我要么必须在文本中编译,要么用二进制文件部署它。


1
投票

看起来您会将

migrationConfiguration.TargetDatabase
设置为
DbConnectionInfo

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

看起来实际使用它的最简单方法是修改您的

DataAccess.Migrations.Configuration
类以使用带有连接字符串的构造函数。


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 初始值设定项中设置连接名称。


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

其中连接字符串是您的特定连接字符串,提供者是数据提供者,例如系统.Data.SqlClient

© www.soinside.com 2019 - 2024. All rights reserved.