私はEF5を使用する4人の開発者のチームで働いており、全員が自分のローカルデータベースで作業しています。これまで自動移行を使用してきましたが、本番環境にリリースする必要がある段階に近づいているため、自動移行を無効にして、明示的なコードベースの移行を追加し始めました。
問題は次のとおりです。開発者が新しい明示的な移行を作成した後にUpdate-Database
コマンドを実行すると、次のエラーが発生します。
Applying code-based migrations: [201209080142319_CreatedDate.LastModifiedDate.Additions].
Applying code-based migration: 201209080142319_CreatedDate.LastModifiedDate.Additions.
Applying automatic migration: 201209080142319_CreatedDate.LastModifiedDate.Additions_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.
自動移行を無効にしたのに、なぜこのエラーが発生するのですか?明示的な移行を削除してから再スキャフォールディングすることで、このエラーを修正できます(Add-Migration
を実行)。その後、Update-Database
は正常に実行され、「自動移行...」については何も言及されません。また、Add-Migrationを実行したときに私が作成した移行のコードは、チームメートが作成したコードと同じです。 AutomaticMigrationsEnabled = false;
以降、自動移行を実行しようとする理由がわかりません。
ここで何が欠けていますか?
私は自分の質問に答えるのが嫌いですが、この問題に再び遭遇しました。私のチームの開発者は、ローカルマシンで自動移行を再度有効にしてから、明示的な移行を作成しました。これにより、実行するとすぐにこの動作が再現されました。
エンティティフレームワークは常に.resx
ファイルで定義されたSource
プロパティを持つ明示的な移行を実行する前に自動移行を実行しますたとえAutomaticMigrationsEnabled = false
。明示的な移行では、自動移行の実行後に作成された場合にのみ、Source
プロパティが設定されます。
結果として、自動移行を無効にすると、EFはモデルの変更を検出したときにスキーマを自動的にアップグレードしませんが、明示的な移行間のギャップを埋める必要がある場合は、自動移行を行う可能性があります。この動作を回避するには、自動移行と明示的な移行を組み合わせて使用しないでください。
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
}
追加 AutomaticMigrationDataLossAllowed = true;
したがって、データの損失につながるSQLオブジェクトの削除をEFに追加できるようにする必要があると想定します。
AutomaticMigrationEnabled = false
は、アプリケーションがデータベースを独自に更新するのを防ぎます。
ただし、Update-databaseを自分で実行しているため、Update-Databaseはデータベースの現在の状態を確認し、コードベースの移行がまだ行われていないモデル(dbContext)の変更を含め、データベースにまだ存在しないすべての移行手順を実行します。 。
私の推測では、データの損失を引き起こすモデルの変更があります。
-force
パラメーターを使用して、データが失われた場合でも変更を適用できます。
私のチームはこれに関連しているかもしれない何かを経験しました。 2人のチームメンバーが両方とも移行を追加し、コードをチェックインして最新のものを取得し、データベースの更新を実行すると、移行が「スキップ」されたため、2番目のメンバーはエラーになります。システムはチームメンバーの移行が実装されていないことを認識します。 。
すべてをチェックインして最新のものを入手し、データベースの更新(チームメンバーが新しい移行を追加した場合)を実行してから、データベースの追加、データベースの更新、チェックインを実行し始めました。