14

ソース管理でブランチを変更した後、Update-Database を実行して以前の移行にロールバックすると、EF は次のように「Reverting automatic migration」というテキストを表示することがあります。

Reverting automatic migration: 201305171619008_DescriptiveNameForMigration.
Reverting code-based migration: 201305162023299_Init.

Entity Framework は、移行を自動化する必要があるとどのように判断したのですか? また、何が違うのでしょうか?

コード ファーストの移行が既にセットアップされているプロジェクトがあると仮定して、これを再現する方法は次のとおりです。

  1. ソース管理で新しいブランチに切り替える
  2. モデル、マッパーに変更を加え、移行を追加する
  3. データベースを更新する
  4. デフォルトのブランチに戻す
  5. 更新データベース -TargetMigration:0 -強制
  6. Update-Database コマンドの結果の「自動移行の取り消し」を参照してください

これは私が考えていることです。間違っている場合は修正してください。

  • Update-Database は、__MigrationHistory で移行を列挙します
  • プロジェクト内の対応する移行ファイルを見つけて、Down() メソッドを呼び出します。
  • 対応する移行ファイルが存在しない場合は、__MigrationHistory のスナップショットに基づいて、移行をロールバックする方法について最善の推測を実行します。
4

1 に答える 1

3

移行をスキャフォールディングすると、Entity Framework は __MigrationsHistory に記録された最後のモデルと現在のモデルとの差分を実行し、その差分を含む移行クラスを作成します。そのスキャフォールディング マイグレーションの Up メソッドと Down メソッドの両方を自由に編集できます。

自動移行により、足場をスキップできます。それらが有効な場合に Update-Database を呼び出すと、現在のモデルと __MigartionsHistory に記録された最後のモデルの差分が実行され、"自動" 移行を使用してその差分が適用されます。自動移行は引き続き __MigrationHistory にレコードを取得しますが、移行クラスはプロジェクトに追加されません。diff の手順は、Up メソッドでスキャフォールディングされたものと同じですが、カスタマイズする機会はありません。

これらの自動移行のいずれかを元に戻すと、記録されたモデルと以前の移行のモデルの差分が実行されます。これらの手順は、スキャフォールディングされた Down メソッドと同じです。

Entity Framework が移行の移行クラスを見つけられない場合、それは自動移行であると見なされます。そのため、Down メソッドをカスタマイズした場合、これらのカスタマイズは元に戻すときに適用されません。

うまくいけば、これで物事が少し明確になります。

于 2013-06-06T16:27:55.413 に答える