23

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 を実行します。これにより、正しいアップ コードとダウン コードを含む移行が生成されます。

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

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

非常にイライラします!

4

7 に答える 7

27

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

  1. プロジェクト内の既存の Migrations フォルダーを削除し__MigrationHistory、既存のデータベースからテーブルを削除します。
  2. enable-migrationsパッケージ マネージャー コンソールからコマンドを実行します。
  3. コマンドを実行add-migrationして、初期移行を作成します。
  4. Up()初期移行のメソッド内のすべてのコードを削除します。
  5. コマンドを実行してupdate-database、初期移行をデータベースに適用します。これにより、既存のオブジェクトが変更されることはありませんが (Up()メソッドにコードが含まれていないため)、既存のデータベースが初期状態に移行されたものとしてマークされます。
  6. コード ファースト モデルに変更を加えます。
  7. コマンドを実行add-migrationして、新しい移行を作成します。Up()新しい移行のメソッドのコードには、オブジェクト モデルへの変更のみが含まれます。
  8. update-databaseコマンドを実行して、変更をデータベースに適用します。
于 2014-05-07T20:28:15.293 に答える
9

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

最後のエラーの原因となる可能性のある問題がもう 1 つあります (それが以前のエラーの根本的な原因である可能性があります)。私は同様の問題を抱えていましたが、何らかの奇妙な理由で、移行クラスの一部がクラスの名前空間とは異なる名前空間にあることが判明しましたMigrationConfiguration。(ファイル内の) 名前空間を修正すると、xxx.Designer.csこの問題が解決されました (移行が表示され、再び機能するようになりました)。

于 2014-04-15T08:51:14.563 に答える
3

-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

于 2013-03-27T09:18:54.790 に答える
0

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

  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

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

于 2014-02-24T19:45:39.950 に答える