我想使用我自己构建的 connectionString 执行(代码优先)迁移。
入口点是一个带有一个参数的静态函数,connectionString。
我有一个名为 PocModel 的 DbContext 类,它有两个默认构造函数。
public PocModel() : base("PocModel")
{ ...
以及带有字符串参数的上下文构造函数:
public PocModel(string nameOrConnectionString): base(nameOrConnectionString)
{ ...
我的目标是在连接字符串所针对的数据库上执行迁移,而不是 EF 仅通过名称“神奇地”创建的连接字符串(localhost\sqlexpress - PocModel)。
这是我无法做到的。
我有一个像这样声明的“外部”函数:
public static void MigrateDatabase(string connectionString)
{ ...
我试图在 flw 中实现这个功能。方法:
DbMigrator migrator = new DbMigrator(new Migrations.Configuration());
migrator.Configuration.TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient");
migrator.Update();
像这样:
Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
Database.SetInitializer<PocModel>(new MigrationInitializer());
PocModel model = new PocModel(connectionString);
model.Dispose();
我什至尝试动态设置
ConfigurationManager.ConnectionString["PocModel"]
到传入的connectionString。
但是很遗憾,一切都失败了,并且从 EF 迁移代码中调用了默认的 PocModel 构造函数,目标是 server:localhost\sqlexpress 和 database:PocModel。
我无法迁移到驻留在“localhost\sqlexpress”上的任何未命名为“PocModel”的数据库。
我不能选择使用 app.config 文件来设置我的 connectionString,因为我需要通过静态外部函数将其传入。
请帮助,现在被这个问题困扰了很长时间。
编辑:我已经通过这个 hack 让它工作了,但我问这个问题是为了验证确实没有其他解决方案(也就是 EF 迁移有问题)
private static string _databaseNameOrConnectionString = "PocModel";
internal static string DatabaseNameOrConnectionString
{
get { return _databaseNameOrConnectionString; }
//HACK: This setter must ONLY be called from SetupModule.MigrateDatabase. It is a hack to circumvent the code-first migrations usage of this ctor.
set { _databaseNameOrConnectionString = value; }
}
//the code first migrations will call this ctor and ignore the connectionString it have been passed.
public PocModel()
: base(DatabaseNameOrConnectionString)
{