125

各コンテキストが独自のデータベースに対応する同じプロジェクト内の複数の DB コンテキストに対して Entity Framework 5 (バージョン 5.0.0) の移行を有効にするにはどうすればよいですか? Enable-MigrationsPM コンソール (Visual Studio 2012) で実行すると、複数のコンテキストがあるためにエラーが発生します。

PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.

実行すると、移行が既に存在するため、Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext実行できません。Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContextMigrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.

4

7 に答える 7

130

Configuration.cs ファイルが既に存在するため、Enable-Migrations への 2 回目の呼び出しは失敗します。そのクラスとファイルの名前を変更すると、別の Configuration.cs を作成する 2 番目の Enable-Migrations を実行できるはずです。

次に、データベースを更新するときに使用する構成を指定する必要があります。

Update-Database -ConfigurationTypeName MyRenamedConfiguration
于 2012-11-20T16:08:39.077 に答える
84

同じ問題に遭遇したばかりで、次の解決策を使用しました(すべてパッケージマネージャーコンソールから)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

これにより、Migrations フォルダーに 2 つの個別のフォルダーが作成されます。それぞれに生成されたConfiguration.csファイルが含まれます。残念なことに、これらのConfiguration.csファイルの名前を変更する必要があります。ファイルの名前をConfigA.csandに変更しましたConfigB.cs

EDIT : (Kevin McPheat の厚意による) Configuration.cs ファイルの名前を変更するときは、クラス名とコンストラクターの名前も変更することを忘れないでください/EDIT

この構造を使用すると、簡単に行うことができます

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

これにより、構成ファイルの隣のフォルダー内に移行用のコード ファイルが作成されます (これらのファイルをまとめておくと便利です)。

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

最後になりましたが、これら 2 つのコマンドは、対応するデータベースに正しい移行を適用します。

編集 2016 年 2 月 8 日: EF7 バージョン 7.0.0-rc1-16348 で少しテストを行いました

-o|--outputDir オプションを機能させることができませんでした。与え続けたMicrosoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

ただし、移行が初めて追加されると、移行フォルダーに追加され、別のコンテキストの後続の移行が自動的に移行のサブドルダーに配置されるように見えます。

元の名前ContextAはいくつかの命名規則に違反しているように見えるので、現在はContextAContextandを使用していContextBContextます。これらの名前を使用すると、次のコマンドを使用できます。

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

これにより、モデルのスナップショットと初期移行が のMigrationsフォルダに作成されますContextAContextContextBこれらのファイルを含むという名前のフォルダーを作成しますContextBContext

フォルダーを手動で追加しContextA、移行ファイルContextAContextをそのフォルダーに移動しました。次に、これらのファイル内の名前空間の名前を変更しました (スナップショット ファイル、最初の移行、および最初の移行ファイルの下に 3 番目のファイルがあることに注意してください... designer.cs)。名前空間に追加.ContextAする必要があり、そこからフレームワークが再び自動的に処理します。

次のコマンドを使用すると、コンテキストごとに新しい移行が作成されます

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

生成されたファイルは正しいフォルダーに配置されます。

于 2015-10-07T13:16:51.340 に答える
7

多くの移行を含む「構成」が既にあり、これをそのまま保持したい場合は、いつでも新しい「構成」クラスを作成して、次のように別の名前を付けることができます

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

次に、コマンドを発行します

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

EF は問題なく移行を足場します。最後にデータベースを更新します。今後、更新する構成を EF に伝えないと、EF は文句を言います。

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

終わり。

Enable-Migrations を処理する必要はありません。「構成」が既に存在すると不平を言うためです。既存の構成クラスの名前を変更すると、移行履歴に問題が発生します。

異なるデータベースをターゲットにすることも、同じデータベースをターゲットにすることもできます。すべての構成で __MigrationHistory テーブルが適切に共有されます。

于 2016-05-24T14:33:15.970 に答える
4

さらにデータベースが存在する場合は、PowerShell で次のコードを使用します

Add-Migration Starter -context EnrollmentAppContext 
  • 「スターター」は移行名です

  • 「EnrollmentAppContext」はアプリのコンテキストの名前です

次のようにして、VS で PowerShell を開くことができます。 Tools->NuGet Package Manager->Package Manager Console

于 2019-03-12T06:41:51.337 に答える