web-dev-qa-db-ja.com

EF移行の問題で立ち往生

どういうわけかEF5プロジェクトを進められない状態になってしまいました。

'update-database'を実行すると、次のようになります。

保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません。保留中のモデル変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabledをtrueに設定します。 Add-Migrationコマンドを使用して、保留中のモデル変更をコードベースの移行に書き込むことができます。

わかりました、それで私は「追加移行」を試みます、そして私は得ます:

次の明示的な移行が保留中であるため、明示的な移行を生成できません:[]。新しい明示的な移行を生成する前に、保留中の明示的な移行を適用します。

20 GOTO 10 ??

この時点で私は何をすべきですか? (NHibernateへの切り替えを超えて?)

25
Spongman

私のために働いたのは:

  1. すべての変更を元に戻します(最初にバックアップを作成します)。既知の良好な状態に戻します。
  2. add-migration DummyMigrationを実行します。それは私がコメントしたいくつかの偽の変更を生み出しました
  3. update-databaseを呼び出して、移行+メタデータを[__MigrationHistory]テーブルに追加します。
  4. 必要な変更を加えます(以前に取得したコードのバックアップから)。
  5. 通常のadd-migration/update-databaseを実行します。

理想的ではなく、より良い解決策があるかどうかを確認するのはクールですが、それは私にとってはうまくいきました。

7
Davy8

私にとっての問題は、移行の名前空間の名前を2014123456_Initial.csに変更したことでした。
しかし、VSは関連する2014123456_Initial.Designer.csで名前空間を再生成していませんでした。

Designer.csが同じ名前空間を使用するように変更されると、すべてが再び機能し始めました。


(これも回答として投稿しました ここ 両方の質問がとても似ているので)

2
demoncodemonkey

Configuration.csクラスの次の値をfalseからtrueに変更しました。

AutomaticMigrationsEnabled = true; 

App_Dataフォルダーで、プロジェクトのデータベースの名前を変更しました-。mdfで終わるファイル(新しいデータベースが作成されます)、およびPackage Manager Consoleで次のコマンドを入力しました:

update-database

その後、保留中の移行はスムーズに実行されました。

これは私にとってはうまくいったことに注意してください。しかし、これがベストプラクティスである場合、私は100%ではありません。いずれにせよ、これ Entity Framework Code First 移行ガイドには次のように書かれています。

"テーブルが既に存在し、作成できないことを示すエラーが発生した場合は、データベースを削除した後、update-databaseを実行する前にアプリケーションを実行したことが原因である可能性があります。その場合、Movies.mdfファイルを再度削除し、update-databaseコマンドを再試行します。それでもエラーが発生する場合は、migrationsフォルダーを削除してください。 "

また、AutomaticMigrationsEnabled = true;について MSDNの記事、データポイント:コードの最初の移行の謎:解決済み "移行は自動的に実行できます。つまり、モデルの変更が検出され、変更に対応する移行がデータベースで作成および実行されます。これらはすべて、データベースの初期化中の実行時に行われます。自動移行は単純なアプリには便利ですが、制御がほとんどないため、通常は有効にすることをお勧めしません。 Code Firstがデフォルトをfalseに切り替えたとき、私は幸せでした。」

1
jyrkim

データベースの作成を間違えました

    using System.ComponentModel.DataAnnotations;
    using System.Globalization;
    namespace ProductsManager.Models
    {
        public class Product
        {
            public int ProductId { get; set; }
            public string Name { get; set; }
            public string Description { get; set; }
            public string Production { get; set; }
            public string Size { get; set; }
            public decimal<--- Price { get; set; }
            public string Barcode { get; set; }
        }
    }

add-migration Initialの後、コードをpublic int Price {get;に変更しました。セットする; }同じadd-migrationDummyMigrationを実行し、移行フォルダー080372472_dummyMigrationに作成しました

namespace IdetityBeta.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class DummyMigration : DbMigration
    {
        public override void Up()
        {
            AlterColumn("dbo.Products", "Price", c => c.String());
        }

        public override void Down()
        {
            AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable:             false, precision:              18, scale: 2));
        }
    }
}

それで、更新-データベースと問題は解決されました

0
Herb Endricott

私はこれを回避しました

  • 「Update-Database-Script-Force」を実行します
    • 「データベースを更新できません...」というエラーの前に試行された最後の明示的な移行に注意してください。
  • 前回の試行で記録された最後の移行を使用して、「Update-Database -Script -TargetMigration [lastmigration]」を実行します

その後、スクリプトで実行して、新しい移行を追加できます。これはEF6とNuget2.8にあり、質問が投稿されたときには機能しなかった可能性があります。

0
Rattle
  1. Update-Database –TargetMigration <second_last_migration>
  2. Add-Migration <full_name_including_timestamp_of_last_migration>

    新しい移行をスキャフォールディングするのではなく、既存の移行を編集することを移行が認識できるように、タイムスタンプを含める必要があります。これにより、最後の移行のメタデータが現在のモデルと一致するように更新されます。

  3. Update-Database

ソース https://docs.Microsoft.com/en-gb/ef/ef6/modeling/code-first/migrations/teams#resolving-the-merge-conflict

0
Caltor

これは、移行と同じベースを持つ移行とマージしようとしている場合に発生する可能性があります。そのため、そのテーブルが存在していても、移行スキーマの1つにモデルの違いがあります。

この問題を解決するには、コマンドでマージ移行を作成します

追加-移行-IgnoreChanges

移行名が続く

これにより、現在のモデルをスナップショットとして使用して空の移行が作成されます。したがって、これによりモデルの違いの問題が解決され、テーブルとモデルが同期されます

0
user3114005