2017-12-19 6 views
3

私はピックルのビットです。明示的な移行で自動移行をキャプチャするための最小限の方法ですか?

  • 自動移行が最初に
  • オンされたいくつかの自動移行を添加した
  • いくつかの明示的な移行を添加した
  • 自動移行は、その後
  • を切った:私はEFを、使用してプロジェクトを継承しました

このコードがデプロイされているマシンがdevマシンと並行して移動し、その結果すべてが完全に動作するDBを持っているため、何も問題はありません。

別のマシンにデプロイした場合、明示的な移行のみが適用されることが懸念されます。実際、新しく開発されたマシンでプロジェクトを実行しようとすると、これが当てはまることがわかりました。

ここでは、SQL作成スクリプトを生成して新しいマシンで実行することで、実行することができます。明らかに、これは長期的な解決策ではありません。

私が見ることのできるオプションは、すべての移行と移行履歴(__MigrationHistory)テーブルをクリアし、すべてをカバーする単一の新しい「初期」移行を作成することです。私が心配しているのは、コードを実行しているすべてのマシン(本番サーバーを含む)でこの手術を実行する必要があるということです。

最初の自動移行を新しい明示的な移行に遡って取得する方法はありますか?これはまったく新しい環境でのみ実行されますか?

+0

すべてが同期している場合は、提案したとおりに移行をリセットしてください。新しいベースライン( 'Add-Migration NewBaseline -IgnoreChanges')を確立し、次に進む移行を追跡します。私たちは何度かこれをやってきて、物をきれいにする。 –

答えて

0

データベースを手動で更新できる場合は、Update-Database -Scriptを実行することをお勧めします。その後、各マイグレーション(自動的なものでも)とSQLコマンドが順番に適用されるのを見ることができます。 次の手順で必要となるため、SQLファイル全体を保存してください。

次に、巨大なBase64文字列を含むINSERTコマンドで区切られた各コマンドブロックを調べます。自動移行を含め、移行の各ステップが分割され順番に並べられていることがわかります。これらのペアのそれぞれについて、実際には、INSERTコマンドの上と最後の移行のINSERTコマンドの下のすべてが必要です。これらをマイグレーション操作と呼んでいます。確かに

は、私は、これはスケールでいくつかの時間がかかりますが、次回の実行Add-Migration -IgnoreChangesが新しいSql()操作を追加Up()方法では、空の移行を足場、そこに(すなわちSql("<your_awesome_script>"))を、現在の移行操作をコピーすることを実現します。安全のためには、対応するDown()も作成する必要があります。

次に、作業中の自動作業の直前と直後の移行のタイムスタンプを確認します。これはINSERTコマンドの最初のパラメータとして201710152132114_<MigrationName>のようになります。これらの2つの間にDateTimeを選択し、その新しいDateTimeを使用して新しい移行の名前を.csとします。これにより、将来の使用のために、ソリューション内で移行が正しく行われるようになります。

最後に、移行の.Designer.csファイルを開き、内部のgetImigrationMetadata.Idは、既存のId文字列作成した新しいマイグレーション名を置き換えます。これは、EFがプログラムを使用して移行操作を注文するためのものです。

マイグレーションが既に適用されている新しいマシンに移動する場合は、使用しているデータベースのインスタンスを調べて、__MigrationHistoryテーブルの最新エントリのIDが何であるかを確認してください。次に、開発環境で移行をターゲットにして戻すその移行を実行し、それぞれの自動について上記の手順に従います。このようにすべての自動移行を変換することができれば、今後すべての明示的な移行が新しい環境に展開されます。

開発環境やテスト環境で作業するまでは、本番マシンでは試してみないことをお勧めします。

+0

ありがとうございます。私はまだそれを試していないが、私はそれが動作する方法を見ることができます。私はこれが "最小限の破壊的"なクラスであるとは確信していませんが、もしそれが_破壊的な方法ならば、それはしなければならないでしょう。 –

関連する問題