web-dev-qa-db-ja.com

エンティティフレームワークコードの移行-初期移行が進まない

Nugetを介してEF 5をプロジェクトに追加し、「Enable-Migrations」コマンドで移行を有効にしました。次に、「Add-Migration」を呼び出して、スキーマを生成するための基本コードを生成しました。

次に、ドメインオブジェクト( "TestProperty"と呼ばれる文字列プロパティ)の1つにプロパティを追加し、EntityTypeConfigurationファイルにマッピングを追加しました(現時点では規則を無視しています)。

「Add-Migration」を再度呼び出すと、エラーが発生します。

Unable to generate an explicit migration because the following explicit migrations are pending: [201303262144218_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

ただし、「Update-Database」を呼び出すと、テーブルがすでに存在するため、SQL例外が発生します。

There is already an object named 'Customer' in the database

私のDbContextのコンストラクタで、次のようなさまざまな更新戦略を試しました:

Database.SetInitializer<UnitOfWork>(new DropCreateDatabaseAlways<UnitOfWork>());

明らかなものがないのですか?私はここで解決策を試しましたが、うまくいきませんでした: ASP.NETの自動移行

ありがとう

編集:更新最初のステップを通過するための鍵は、初期移行を作成し、生成されたコードをUpメソッドとDownメソッドから削除することです( http://thedatafarm.com/blog/data-access/using- ef-migrations-with-an-existing-database / )。

次に、モデルとEFマップを更新してから、Add-Migrationを実行します。これにより、正しいUpおよびDownコードで移行が生成されます。

その後、問題はアップデートを適用しようとしています。 Update-Databaseは、「保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません...自動移行です。DbMigrationsConfiguration.AutomaticMigrationsEnabledをtrueに設定して、自動移行を有効にします。Add-Migrationを使用できます。保留中のモデル変更をコードベースの移行に書き込むコマンド。」 OK、それでAdd-Migrationをもう一度試してみると、最後のコードとまったく同じコードで別のマイグレーションが作成されます。

Update-Databaseを実行すると、同じエラーが再び発生します。 「Update-Database -TargetMigration 201304080859556_MyMigration -Force」を実行しようとしましたが、「指定されたターゲットの移行 '201304080859556_MyMigration」が存在しません。ターゲットの移行が既存の移行IDを参照していることを確認してください」-存在します。

とてもイライラします!

19
SturmUndDrang

既存のデータベースを使用してコードファーストモデルのEF移行を有効にするのと同じ問題があり、次の手順が機能しました。

  1. プロジェクト内の既存のMigrationsフォルダーを削除し、既存のデータベースからテーブル___MigrationHistory_を削除します。
  2. パッケージマネージャーコンソールから_enable-migrations_コマンドを実行します。
  3. _add-migration_コマンドを実行して、初期移行を作成します。
  4. 最初の移行のために、Up()メソッド内のすべてのコードを削除します。
  5. _update-database_コマンドを実行して、初期移行をデータベースに適用します。これにより、既存のオブジェクトは変更されません(Up()メソッドにコードが含まれていないため)。ただし、既存のデータベースが初期状態に移行されたものとしてマークされます。
  6. コードファーストモデルに変更を加えます。
  7. _add-migration_コマンドを実行して、新しい移行を作成します。新しい移行のUp()メソッドのコードには、オブジェクトモデルへの変更のみが含まれます。
  8. _update-database_コマンドを実行して、変更をデータベースに適用します。
22
MrUpsideDown

Update-Databaseを実行すると、同じエラーが再び発生します。 「Update-Database -TargetMigration 201304080859556_MyMigration -Force」を試してみますが、「指定されたターゲットの移行 '201304080859556_MyMigration'が存在しません。ターゲットの移行が既存の移行IDを参照していることを確認してください」と表示されます。

最後のエラーを引き起こす可能性のあるもう1つの問題があります(そしてそれが前のエラーの根本的な原因である可能性があります)。私も同様の問題を抱えていましたが、いくつかの奇妙な理由で、私のマイグレーションクラスのいくつかが、MigrationConfigurationクラスのネームスペースとは異なるネームスペースにあることがわかりました。名前空間の修正(xxx.Designer.csファイル)がこの問題を解決しました(マイグレーションが表示され、再び機能していました)。

7
Łukasz Wiatrak

-forceパラメータを使用して変更を適用してみましたか?.

Update-Database [-SourceMigration <String>]
  [-TargetMigration <String>] [-Script] [-Force] [-ProjectName <String>]
  [-StartUpProjectName <String>] [-ConfigurationTypeName <String>]
  [-ConnectionStringName <String>] [<CommonParameters>]

-FORCEデータベースの自動移行中にデータの損失が許容されることを指定します。

get-help Update-Database -examplesを使用すると、使用例を表示できます。

さらに読む: EF Code First Migrations

3
Matija Grcic

古いdbバージョンを新しいモデルに移行しようとすると、データベースが新しいモデルと一致しなかったか、次のようなエラーが発生しました。

メンバー 'Npgsql.PostgresException、Npgsql、Version = 3.2.2.0、Culture = neutral、PublicKeyToken = 5d8b90d52f46fda7'のタイプは解決されません

これがどのように機能したか(自動移行を使用):

  1. Migrationsフォルダーを削除する
  2. Enable-migrationsを実行する
  3. 新しく作成されたConfiguration.csで、この2つのプロパティをtrueに設定します

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }
    
  4. Update-Database -Forceを実行する

データベースが最新のスキームに更新され、準備が整います。

お役に立てれば。

0
Chtiwi Malek

手動で移行を削除する必要はありません。

Remove-Migration

その後、Add-Migrationを使用して移行スクリプトを再作成できます。

あなたのケースでは、既存のテーブルがあるためデータベースの更新に失敗しました、それらをドロップしてください

Drop-Database

次に、Update-Databaseを実行できます。

これらのコマンドのより詳細な使用法は here です。

0
Chayapol

これは通常機能する包括的なアプローチです。

  1. Migrationsフォルダー全体を削除します(マイグレーション構成ファイルのシードメソッドから作成したコードを必ずコピーしてください)。
  2. 実際のデータベースを削除します。 LocalDbを使用している場合、これは通常、AppDataソリューションフォルダー内にあります(右クリック->フォルダーの場所を開く)。必ず.mdfおよび.logデータベースファイルを削除してください。
  3. パッケージマネージャーコンソールに移動します。入る enable-migrations -projectname yourprojectname
  4. パッケージマネージャーコンソールに移動します。入る add-migration "Initial" -projectname yourprojectname
  5. 移行構成ファイルを開き、手順1からコピーしたコードをシードメソッドに貼り付けます。
  6. パッケージマネージャーコンソールに移動します。入る update-database -projectname yourprojectname

これでうまくいくはずです。

0
user3083619