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を参照していることを確認してください」-存在します。
とてもイライラします!
既存のデータベースを使用してコードファーストモデルのEF移行を有効にするのと同じ問題があり、次の手順が機能しました。
__MigrationHistory
_を削除します。enable-migrations
_コマンドを実行します。add-migration
_コマンドを実行して、初期移行を作成します。Up()
メソッド内のすべてのコードを削除します。update-database
_コマンドを実行して、初期移行をデータベースに適用します。これにより、既存のオブジェクトは変更されません(Up()
メソッドにコードが含まれていないため)。ただし、既存のデータベースが初期状態に移行されたものとしてマークされます。add-migration
_コマンドを実行して、新しい移行を作成します。新しい移行のUp()
メソッドのコードには、オブジェクトモデルへの変更のみが含まれます。update-database
_コマンドを実行して、変更をデータベースに適用します。Update-Databaseを実行すると、同じエラーが再び発生します。 「Update-Database -TargetMigration 201304080859556_MyMigration -Force」を試してみますが、「指定されたターゲットの移行 '201304080859556_MyMigration'が存在しません。ターゲットの移行が既存の移行IDを参照していることを確認してください」と表示されます。
最後のエラーを引き起こす可能性のあるもう1つの問題があります(そしてそれが前のエラーの根本的な原因である可能性があります)。私も同様の問題を抱えていましたが、いくつかの奇妙な理由で、私のマイグレーションクラスのいくつかが、MigrationConfiguration
クラスのネームスペースとは異なるネームスペースにあることがわかりました。名前空間の修正(xxx.Designer.cs
ファイル)がこの問題を解決しました(マイグレーションが表示され、再び機能していました)。
-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
古いdbバージョンを新しいモデルに移行しようとすると、データベースが新しいモデルと一致しなかったか、次のようなエラーが発生しました。
メンバー 'Npgsql.PostgresException、Npgsql、Version = 3.2.2.0、Culture = neutral、PublicKeyToken = 5d8b90d52f46fda7'のタイプは解決されません
これがどのように機能したか(自動移行を使用):
新しく作成されたConfiguration.csで、この2つのプロパティをtrueに設定します
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
Update-Database -Forceを実行する
データベースが最新のスキームに更新され、準備が整います。
お役に立てれば。
手動で移行を削除する必要はありません。
Remove-Migration
その後、Add-Migration
を使用して移行スクリプトを再作成できます。
あなたのケースでは、既存のテーブルがあるためデータベースの更新に失敗しました、それらをドロップしてください
Drop-Database
次に、Update-Database
を実行できます。
これらのコマンドのより詳細な使用法は here です。
これは通常機能する包括的なアプローチです。
enable-migrations -projectname yourprojectname
add-migration "Initial" -projectname yourprojectname
。update-database -projectname yourprojectname
これでうまくいくはずです。