web-dev-qa-db-ja.com

EF移行の "移行"フォルダーの場所を変更することはできますか?

デフォルトでは、add-migrationコマンドは移行.csファイルを作成しようとします

  • プロジェクトルート
    • マイグレーション

移行と残りのEF関連コードをプロジェクトの\ Dataフォルダーに保存します。

  • プロジェクトルート
    • データ
      • マイグレーション

この構造で、実行すると

PM> add-migration Migration1

nuGetコンソールで次のエラーを受け取ります。

 System.IO.DirectoryNotFoundException:パス 'C:\ MyProjectRoot\Migrations\201112171635110_Migration1.cs'の一部が見つかりませんでした。
 System.IO .__ Error.WinIOError(Int32 errorCode、String maybeFullPath)
 System.IO.FileStream.Init(String path、FileMode mode、FileAccess access、Int32 rights、Boolean useRights、FileShare share、Int32 bufferSize、FileOptions options、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath)
 at System.IO.FileStream..ctor(String path、FileMode mode、FileAccess access、FileShare share、Int32 bufferSize、FileOptions options)
 at System.IO.StreamWriter.CreateFile(Stringパス、ブール型付加)
 at System.IO.StreamWriter..ctor(String path、Boolean append、Encoding encoding、Int32 bufferSize)
 at System.IO.StreamWriter..ctor(String path、ブール型付加、エンコーディングエンコーディング)
 at System.IO.File.InternalWriteAllText(String path、String contents、Encoding encodin g)
 at System.IO.File.WriteAllText(String path、String contents)

add-migrationコマンドの実行時に移行ファイルを作成するディスク上の場所を指定することは可能ですか?

42
shrichards

構成クラスコンストラクターで、次の行を追加します。

this.MigrationsDirectory = "DirOne\\DirTwo";

名前空間は、構成クラス自体の名前空間として引き続き設定されます。これを変更するには、次の行を追加します(これも構成コンストラクターにあります)。

this.MigrationsNamespace = "MyApp.DirOne.DirTwo";
63
Roger

enable-migrationsパラメータを使用して、-MigrationsDirectoryコマンド(Configurationクラスを作成する)の呼び出し中に、マイグレーションフォルダを指定することもできます。

enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName

この例では、Configurationクラスを作成し、MigrationsDirectoryを、プロジェクトのルートフォルダーを基準に指定したフォルダー 'Migrations\CustomerDatabases'に設定します。

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\CustomerDatabases";
}


複数のコンテキストと移行フォルダを持つプロジェクトについて説明する this の記事も参照してください。

ちなみに、複数のマイグレーションフォルダーと複数のコンテキストを使用している場合は、OnModelCreating派生クラスのDbContextメソッドにデフォルトスキーマの名前を設定することも検討してください(Fluent -API構成です)。これはEF6で機能します。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("CustomerDatabases");
    }

は、データベーステーブルの前にスキーマ名を付けます。これにより、別のテーブルから独立しているテーブルのグループがいくつかあるシナリオで、単一のデータベースで複数のコンテキストを使用できるようになります。 (これにより、MigrationHistoryテーブルの個別のバージョンも作成されます。上記の例ではCustomerDatabases.__MigrationHistoryになります)。

19
Martin