我想使用我自己构建的 connectionString 执行(代码优先)迁移。
入口点是一个带有一个参数 connectionString 的静态函数。
我有一个名为 PocModel 的 DbContext 类,其中有一个默认构造函数。
public PocModel() : base("PocModel")
{ ...
还有一个带有字符串参数的上下文构造函数:
public PocModel(string nameOrConnectionString): base(nameOrConnectionString)
{ ...
我的目标是在 connectionString 所针对的数据库上执行迁移,而不是 EF 通过名称“神奇地”创建的 connectionString(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。
但可惜,一切都失败了,默认的 PocModel 构造函数是从 EF 迁移代码中调用的,目标是 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)
{
最佳答案
Update-database 调用使用默认构造函数,因此您必须修改该函数。你提到你有一个静态类来做到这一点,如果没有静态助手,我无法找到一种方法来完成这项工作。
public static class Helper
{
public static string GetConnectionString()
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = @".\sqlexpress";
builder.InitialCatalog = "migrateme";
builder.IntegratedSecurity = true;
builder.MultipleActiveResultSets = true;
return builder.ConnectionString;
}
}
然后我没有调用基本构造函数,而是使用自定义字符串调用构造函数,它创建了正确的数据库
public PocModel() : base(Helper.GetConnectionString())
{
}
关于.net - Entity Framework 4.3.1 迁移始终调用默认构造函数并忽略连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863301/