自分で作成した 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)
{