エンティティフレームワークで明示的な移行を生成できません


96

新しい移行を追加していますが、このメッセージは次のことを示しています。

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

誰も私を助けることができますか?


11
これは、誤ってスタートアッププロジェクトを別のプロジェクトに切り替えたときに起こりました。あなた(またはこれを読んでいる他の人)は、さらに詳細なトラブルシューティング(特に、マイグレーションなどの削除を開始する必要がある問題)を試す前に、すぐに確認することをお勧めします。
NicholasFolk

データベースの_MigrationHistoryで更新されていないMigrationsディレクトリに移行クラスがあります。Migrationクラスとデータベースの両方で同じ状態になるようにそのクラスを削除すると、問題が解決しました。
Aryan Firouzian 2018年

1
これはランダムに起こります。それが起こるとき、それは私のすべてのマイグレーションが適用される必要があることを示しています。Visual Studioを再起動して機能させるには、すべてが正しく設定されているためです。
Larry Flewwelling

回答:


81

これは、アプリケーションに未処理の移行がいくつかありUpdate-Database、別の移行を追加する前に実行する必要があることを示しています。


12
初期移行を再作成したいものは何ですか?これはあなたがそうすることを妨げますか?
レベッカ

うまくいきませんでした。Update-Databaseで別のエラーが発生しました。最初に保留中のファイルを削除する必要がありました。
Vahx、2015年

1
トーマスの答えは、私の似たような場合に役立つものでした。
Tarek Shawadfy、2015

2
スタートアッププロジェクトの宣言が必要になる場合があります-StartupProject ContentHub.Database
osanger

2
Update-Database>保留中の変更があるため、現在のモデルに一致するようにデータベースを更新できません
ASpirin

53

私も同じ問題を抱えていました。どうやらエンティティフレームワークは、データベースに接続できないときにこのエラーを生成します。他の問題を検索する前に、アクセスできることを確認してください。


1
また、App.configを別のプロジェクトに移動した場合や、プロジェクトで単純に欠落している場合や、プロジェクトに含まれているが正しく構成されていない場合にも当てはまります。
Code Maverick

IPを変更した後も同じエラーが発生しました(場所の切り替え後とdyn dnsの変更後の両方で起こりました)。これにより、ログインを取り消すために使用しているAzureデータベースにファイアウォールが発生しました。EFの移行がうまくいかず、「ログインできませんでした」ではなく上記のエラーが表示されます...
Victor

8
もう1つ指摘したいのは、スタートアッププロジェクトがdbコンテキストの接続文字列を含むプロジェクトであることを確認することです。スタートアッププロジェクトを一時的に変更したときにこの問題が発生し、他のプロジェクトに同じ接続文字列がないことに気づきませんでした。
Gage Trader

@GageTraderに追加:私は複数のスタートアッププロジェクトを持っていました。1つは設定なし、もう1つはEF-config付きのWebプロジェクトです。移行を伴う(リポジトリ)プロジェクトのapp.configには、Webプロジェクトと同じEF構成があります。リポジトリプロジェクトをスタートアッププロジェクトとして選択しても機能しませんでしたが、Webプロジェクトをスタートアップに設定すると機能しました。
JimiSweden 2017

私は-ConnectionStringパラメーターを明示的に指定する必要がありましたが、これは私にとってはトリックでした
Brian Colavito

34

パッケージマネージャーコンソールから「update-database」を実行して変更をデータベースにプッシュするか、またはMigrationsフォルダーから保留中の移行ファイル([201203170856167_left])を削除してから、「add-migration」を再実行して編集に基づいて新しい移行を作成します。


移行ファイルを削除してadd-migrationを実行しましたが、それでも同じエラーが発生します。
nu everest 2014年

2
おかげで、保留中の移行ファイルの削除に関するヒントは命の恩人でした
Manish

30

このエラーは、移行が認識されなくなったことも意味します。これは、Migrations.ConfigurationのContextKeyの値を変更した後に発生しました。解決策は、データベーステーブル "__MigrationHistory"のContextKeyを更新することです(または、Configurationクラスの値を元に戻します)。アプリケーションのContextKeyと名前空間は一致する必要があります。


1
それが私の場合の正解でした。新しい類似プロジェクトに古いプロジェクトの1つを使用したため、古い移行でDBに変更を加えることができませんでした。Thomasが示唆したように、名前空間はMigrationsの_MigrationsHistoryテーブルのContextkeyとは異なり、古い移行が認識されなくなりました。
Tarek Shawadfy、2015

これは、ソリューションの名前を変更することで問題を引き起こしたため、役に立ちました。その過程で、ContextKeyの名前を変更して、_MigrationHistoryエントリと一致しなくなったようにしました。
Joel

また、私にとっても機能し、構成に明示的なコンテキストキーを設定し、__ MigrationHistoryでそれを変更し、update-databaseはすべてがクールであると判断しました。ありがとう!
ジェームズホワイト

2
ばかげているが、それは正しい。プロジェクト名を更新した場合、またはプロジェクト(私の場合)をいくつかに分割し、新しいプロジェクトから同じdbに新しい移行を追加しようとしている場合は、正しいContextKeyを使用する必要があります。構成コンストラクターで設定できます(ターゲットDBの__MigrationHistoryテーブルにあるContextキーを使用する必要があります)
BotanMan

ここでも同じですが、デフォルトの名前空間の名前を変更し、ソリューション全体で置き換えました。これにより、この問題が発生しました
WtFudgE

18

1.接続文字列/接続許可

接続文字列をもう一度確認してください。

接続先のユーザーに、引き続き読み取り[__MigrationHistory]権限があり、スキーマを編集する権限があることを確認してください。

アプリケーションまたはWeb構成ファイルの接続文字列を変更して、統合セキュリティ(Windows Auth)を使用してadd-migrationコマンドを自分で実行することもできます

例えば:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

この接続文字列は、DbContextが配置されているプロジェクトのApp.configファイルに含まれます。

2.スタートアッププロジェクト

コマンドラインでStartUpプロジェクトを指定するか、またはMigrationsフォルダーでプロジェクトを右クリックしてDbContextConfiguration[ Set up StartUp project ]を選択します。私は真剣です、これは実際に役立ちます。

ここに画像の説明を入力してください


はは。これがもっと多くの票を獲得することを願っています。これは私によく起こり、Integrated Security修正はうまくいきます!
Jess

1
同じ問題がありましたが、移行コマンドはどれも機能しませんでした。スタートアッププロジェクトを設定しないことが原因であることが判明しました。それを設定すると問題が解決しました。
Vishal

スタートアッププロジェクトを変更するとうまくいきました。私はそれがうまくいかないと確信していましたが、他のすべてが失敗したのでとにかくそれを試しました。すばらしい答えです。
シルヴァン

「スタートアップとして設定」- 推測したことはありません!ありがとうございました!!
Jasel

1
はい、スタートアッププロジェクトを意図的に変更しましたが、元に戻すのを忘れていました。そして面白いのは、以前の1つの移行が適切なスタートアッププロジェクトで行われたため、すべてが正常に機能したことです。しかし、これは論理的です-b / c EFはプロジェクトから接続文字列を
取得

8

同じ問題があり、上記の回答からいくつかのヒントで解決することができました:

  • パッケージマネージャーコンソールで、既定のプロジェクトを確認します(移行構成を含むプロジェクトをポイントします)
  • startup-projに、有効な接続文字列(または
  • 移行を伴うプロジェクトに、有効な接続文字列を持つapp.config / web.configがあることを確認してください
  • DBの権限を確認します(接続文字列で構成されたユーザーの場合)

パッケージマネージャコンソールで "update-database -verbose"を使用して、移行が接続しようとする場所に関するより具体的な情報を取得します。(私の場合、私の起動プロジェクトが正しく設定されていないことがわかりました...)


2
「update-database -verbose」を実行して、接続文字列が壊れていることに気付きました、笑。そのため、add-migrationコマンドは間違ったメッセージを出します。
Wachburn

4
「enstartup-proj {...}」で問題が解決した。ありがとう@flex
Andy Schmitt

7

使用していないUpdate-Database場合は、削除してください。更新を実行した場合は、次を使用してロールバックしますUpdate-Database -TargetMigration "NameOfPreviousMigration"、から削除します。

リファレンス:http : //elegantcode.com/2012/04/12/entity-framework-migrations-tips/

このテキストをここから直接コピーしました。最後のAdd-Migrationコマンドを元に戻すにはどうすればよいですか?


7

この問題が発生した場合は、add-migrationコマンドレットにパラメーターを追加してみてください。たとえば、起動プロジェクトと接続文字列名を指定すると、EFがターゲットデータベースを見つけるのに役立ちます。

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

どこ:

Delta_Defect_0973は移行の名前です

your.namespace.ContextClassNameは、完全な名前空間を前に付けた、移行フォルダー内の構成クラスの名前です。

DeltaProjectは、web.configまたはapp.configファイルを含むメインプロジェクトの名前です。

DeltaSQLは、web.configまたはapp.configファイルで定義された接続文字列の名前です。


ありがとう。これは本当に役に立ちました。
Jess

また、ソリューションで依存関係注入を使用している場合は、パッケージマネージャーコンソールで別のデフォルトプロジェクトを選択する必要がある場合があります。EFが移行を見つけられない場合は、実際に移行を含むプロジェクトをデフォルトプロジェクトとして選択してみてください。
Yves Rochon

5

このエラーは、別の明示的な移行を実行する前に、保留中の移行をコミットする必要があることを意味します。あなたは選択することができます

  1. Update-Databaseコマンドを使用して保留中の移行を実行する
  2. 保留中の移行を削除します。最も安全な方法は、[Migrations]フォルダーを開いて[201203170856167_left]を右クリックし、[プロジェクトから除外]を選択することです。

この後、「Add-Migration ...」を再び開始できます

それが役に立てば幸い


4

ちょうど私の2セント:

私のシナリオ:

  1. ローカルデータベースを作業状態に復元しました。
  2. すでに移行が適用されています。
  3. 新しい移行を追加しようとするたびに、OPで述べたように、保留中の移行に関するエラーが発生しました。

解決:

これを回避するために、より明示的なパラメーターを提供しました:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

app.configフォルダーで設定を設定して、この動作をデフォルトにできるため、毎回明示的なパラメーターを指定する必要がないと私は信じています。ただし、これを行う方法についてはわかりません。


1
これは私にとってはうまくいきました、私は上記のコマンドの最後に移行の名前を追加しました。
sforsはモニカを2017

1
=)-お役に立ててよかったです。
IbrarMumtaz 2017年

1
-ConnectionStringNameこれは別の方法であり、接続文字列を構成から名前でプルします
Simon_Weaver

1
接続文字列を構成ファイルに保存していないので、これは私に役立ちました
Sasinosoft

3

あいまいさがあるため、エラーが発生します。最善の方法は、現在の移行ファイルを除外して新しい移行(add-migration)ファイルを作成し、新しい移行の内容を除外されたファイルにコピーして再度含め、update-databaseコマンドを実行することです。


私はupdate-databaseコマンドを実行した後、コマンドを再試行し、add-migrationそれが機能しました
Smitty-Werben-Jager-Manjenson

3

私はこのような同じ問題を解決しました:

  • 古い移行ファイルを削除する
  • update-database -force
  • Add-Migration AddedEntity
  • データベースを更新する

1

私は同じ問題を抱えており、Add-Migration 'MigrationName' -Forceを実行してそれを解決することしかできませんでした

-Forceは重要な部分です。


1

ローカルデータベースにデータが__MigrationHistory入力されていないか、存在していません。テーブルを手動で作成し、そのテーブルのデータをPRODからローカルデータベースに移行しました。これにより、VSは、移行が適用されたと見なしていました(これは以前から行われていました)。


同じ問題があり、ライブDBを本番環境にマージしましたが、移行履歴が失われました。
マシー

1

ヒント:-Scriptわからない場合は、移行コマンドにスイッチを使用することをお勧めします。また、実際に何Update-Databaseが行われているかを理解するのにも役立ちます。

次のコマンドを実行してデータベースを更新し、手動で適用できるスクリプトを取得します(または、-Scriptタグなしでもう一度実行します)。

以下のためにUpdate-Database私は次のことを実行します:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

SQL_AzureLive私の設定の名前付き接続文字列はどこですか?

次に、SQLが正しく表示されていることを確認し、適用して完了します。他の多くの人が接続文字列が間違っているか無効であると言ったように、このエラーが発生します。


1

私にとって、私はMigrationsフォルダーから移行ファイル(あなたの場合は "201203170856167_left")を削除し、次にパッケージマネージャーコンソールで以下のコマンドを実行しました

Add-Migration <Parameter>
Update-Database

0

シナリオ

  • 新しいDB移行を作成したブランチで作業しています。
  • 私はマスターから更新する準備ができていますが、マスターにも最近のDB移行があります。
  • 競合を防ぐために、ブランチのdbマイグレーションを削除します。
  • 「マスターから更新」します。

問題

マスターから更新した後、「Add-Migration my_migration_name」を実行しましたが、次のエラーが発生します。

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

そのため、 "Update-Database"を実行すると、次のエラーが発生します。

保留中の変更があり、自動移行が無効になっているため、現在のモデルに一致するようにデータベースを更新できません

解決

この時点で、「Add-Migration my_migration_name」を再実行すると問題が解決しました。私の理論では、「Update-Database」を実行すると、「Add-Migration」が機能するために必要なすべての状態が得られます。


0

私もこの問題に遭遇しました。新しいDBを作成し、コードファーストのDB移行の保留中の変更があったときに、「Update-Database」コマンドを実行しようとしました。解決策:「Add-Migration -MigrationName」コマンドを実行して、新しいDBの新しい移行を作成します。次に、「Update-Database」コマンドを実行します。


0

Add-Migrationを実行したときに最新であることがわかっていたデータベースについても、この問題が発生しました。Add-Migrationコマンドをもう一度実行するだけで解決します。上記のRobin Dorbellが示唆しているように、接続の問題を疑います。


私のシナリオでは、コマンドの実行時にデータベース名の大文字と小文字が区別されました。接続
文字列を

0

これは、すでにdbに存在する古いマイグレーションのクラスの名前を突然変更したときに発生しました。VCSの履歴を確認し、それを確認して名前を変更しました。その後、すべてが機能しました。


0

私は別の方法でやった。データベースを完全に削除し、vs。でもう一度「update-database」を実行しました。


これは実行可能な修正を提供しません。有効な移行では、既存の構造が維持されます。
Ferdipux、

0

もっと簡単な問題がありました。ワークステーションに接続されたクライアントのサイトへのVPN接続があると、VSはこのエラーを誤って報告しました。問題は、DBMSセキュリティが実際のローカルIPからの要求のみを受け入れるように設定されていることでした。VPNをオフにするだけで問題は解決しました。


0

私の場合、AzureのファイアウォールルールにIPアドレスを追加するのを忘れていました。基本的に、データベースに接続できなかったため、このエラーが発生しました。したがって、具体的には、AzureのデータベースファイアウォールルールにIPアドレスを追加したところ、すべてうまくいきました。これとは別に、プロキシ/インターネット接続/ DBユーザー名パスワード/ DB接続文字列などの問題である可能性があります。または、Update-Databaseコマンドを実行する必要がある移行が保留されている可能性があります。


0

これまでは、保留中の移行を削除するか、残りが1つだけでほとんどが望ましい場合は、を使用-fして再作成することで、これを常に解決していました。

最近、これは私のために働くのをやめました。

これが最初に発生したとき、私はVisual Studioを再起動し、それから続行することができました。

2回目は、プロジェクトでCleanを実行した後でのみ機能しました。エクスプローラーからすべてのファイルを削除しても、保留中の移行が保持されているかのようでした。


0

これは多くの人にとっての答えにはなりませんが、EFはDBに接続できないときにこのエラーを解消します。私のように自宅で仕事をしている場合は、VPNに接続されていることを確認してください。


-1

移行から別の移行に戻った直後に、まったく同じ問題が発生しました。

私の場合は、「targetedmigration」を「migration06」から「migration04」に変更しています。

「migration0」6を削除する必要がありましたが、「migration05」を強制的に作成することができました。これは基本的に、対象とする移行の後で次の移行を維持する必要があることを意味します。


-1

私の場合(MS Visual Studioを使用)、Visual Studioを再起動するのと同じくらい簡単でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.