web-dev-qa-db-ja.com

更新-データベースは、自動移行が無効になっている場合でも自動移行を実行しようとします

私は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;以降、自動移行を実行しようとする理由がわかりません。

ここで何が欠けていますか?

18
Dave Graves

私は自分の質問に答えるのが嫌いですが、この問題に再び遭遇しました。私のチームの開発者は、ローカルマシンで自動移行を再度有効にしてから、明示的な移行を作成しました。これにより、実行するとすぐにこの動作が再現されました。

エンティティフレームワークは常に.resxファイルで定義されたSourceプロパティを持つ明示的な移行を実行する前に自動移行を実行しますたとえAutomaticMigrationsEnabled = false。明示的な移行では、自動移行の実行後に作成された場合にのみ、Sourceプロパティが設定されます。

結果として、自動移行を無効にすると、EFはモデルの変更を検出したときにスキーマを自動的にアップグレードしませんが、明示的な移行間のギャップを埋める必要がある場合は、自動移行を行う可能性があります。この動作を回避するには、自動移行と明示的な移行を組み合わせて使用​​しないでください。

25
Dave Graves
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }

追加 AutomaticMigrationDataLossAllowed = true;したがって、データの損失につながるSQLオブジェクトの削除をEFに追加できるようにする必要があると想定します。

3
user761172

AutomaticMigrationEnabled = falseは、アプリケーションがデータベースを独自に更新するのを防ぎます。

ただし、Update-databaseを自分で実行しているため、Update-Databaseはデータベースの現在の状態を確認し、コードベースの移行がまだ行われていないモデル(dbContext)の変更を含め、データベースにまだ存在しないすべての移行手順を実行します。 。

私の推測では、データの損失を引き起こすモデルの変更があります。

-forceパラメーターを使用して、データが失われた場合でも変更を適用できます。

0
jjslagace

私のチームはこれに関連しているかもしれない何かを経験しました。 2人のチームメンバーが両方とも移行を追加し、コードをチェックインして最新のものを取得し、データベースの更新を実行すると、移行が「スキップ」されたため、2番目のメンバーはエラーになります。システムはチームメンバーの移行が実装されていないことを認識します。 。

すべてをチェックインして最新のものを入手し、データベースの更新(チームメンバーが新しい移行を追加した場合)を実行してから、データベースの追加、データベースの更新、チェックインを実行し始めました。

0
Rusty Divine