我有一个 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 的情况下完成此操作。
我用
var migrator = new DbMigrator(new DbMigrationsConfiguration { TargetDatabase = new DbConnectionInfo("MyConnectionStringHere")});
migrator.Update();
因此,除非有人提出更好的答案:在 EF6 中,从 EF 6.1.3 开始,没有工作方法可以为编程数据库迁移指定运行时连接字符串。我认为我唯一能看到的是我需要生成一个 sql 脚本并在数据库设置时以编程方式运行它。问题是我要么必须在文本中编译,要么用二进制文件部署它。
看起来您会将
migrationConfiguration.TargetDatabase
设置为 DbConnectionInfo
。
DbConnectionInfo
的构造函数之一采用连接字符串。
请参阅MSDN
看起来实际使用它的最简单方法是修改您的
DataAccess.Migrations.Configuration
类以使用带有连接字符串的构造函数。
您可以设置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 初始值设定项中设置连接名称。
我最近需要这样做,我的解决方案是创建一个自定义配置类。完整的代码库非常适合我。
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