4

自分で作成した connectionString を使用して (コード ファーストの) 移行を実行したいと考えています。

エントリ ポイントは、connectionString という 1 つのパラメータを持つ静的関数です。

デフォルトのコンストラクターを持つ PocModel という DbContext クラスがあります。

public PocModel() : base("PocModel")
{ ...

そして、文字列引数を持つコンテキスト コンストラクター:

public PocModel(string nameOrConnectionString): base(nameOrConnectionString)
{ ...

私の目標は、EFが名前のみ(localhost\sqlexpress - PocModel)を介して「魔法のように」作成するconnectionStringではなく、connectionStringの対象となるデータベースで移行を実行することです。

これは私にはできませんでした。

次のように宣言された「外部」関数があります。

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 を設定することはできません。静的な外部関数を介してこれを渡す必要があるためです。

助けてください、この問題で非常に長い間立ち往生しています。

編集:私はこのハックでそれを機能させましたが、問題に対する他の解決策が実際にないことを確認するために質問しています(別名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)
        {
4

3 に答える 3

1

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())
{ 

}
于 2012-08-08T12:44:53.230 に答える
0

私はあなたと同じ問題を抱えていました。ただし、試してみたがうまくいかなかったとあなたが言った解決策を見つけました。次のコードは私にとってはうまくいきました。ここで見つけましたhttp://romiller.com/2012/02/09/running-scripting-migrations-from-code/

var configuration = new Configuration();
configuration.TargetDatabase = new DbConnectionInfo("Server=MyServer;Database=MyDatabase;Trusted_Connection=True;", 
    "System.Data.SqlClient");
var migrator = new DbMigrator(configuration);
migrator.Update();
于 2013-03-07T14:39:32.913 に答える