.net - Entity Framework 4.3.1 迁移始终调用默认构造函数并忽略连接字符串

标签 .net entity-framework database-migration

我想使用我自己构建的 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/

相关文章:

c# - 如何测试 XML 字符串在 .net 中的格式是否正确

c# - EntityFramework7 - 约定、属性和配置

node.js - 使用 Sequelize 进行数据库迁移后,列名不同

.net - 在 Azure 中保护应用程序的客户端 ID 和 key

.net - 您有任何提高 ReSharper 和/或 Visual Studio 性能的技巧吗?

asp.net - 在 VS2010 中,新的 asp "showat"属性要求不一致。为什么?

.net - 将 F# 用于 BLL 实现是否有意义?

linq - 如何在程序中的 Entity Framework 中检索实体的映射表名称

php - 复制安装后无法登录Wordpress wp

ruby-on-rails - rails : ArgumentError - you can't define an already defined column