同じDB内の複数のDBコンテキストとEF 6のアプリケーションおよびコードファーストの移行


94

Entity Frameworkは初めてです。EF 6を使用するMVCアプリケーションをセットアップしようとしています。コードファーストマイグレーションを使用しています。アプリでAreasを使用していて、分割するために各エリアに異なるDbContextsを設定したいと考えています。私はEF 6にContextKeyがあることを知っていますが、それを使用する方法に関する完全な情報を見つけることができません。現在、マイグレーションは一度に1つのコンテキストしか使用できません。

私のようなEFに新しい人が理解して使用するのに十分な詳細を備えた例を誰かが示すことができますか?

回答:


176

Entity Framework 6ではDbContext-ContextTypeNameおよび-MigrationsDirectoryフラグを追加することにより、複数ののサポートが追加されました。パッケージマネージャーコンソールでコマンドを実行し、以下の出力を貼り付けました...

DbContextプロジェクトに2 秒あり、を実行するとenable-migrations、(おそらくすでに知っているように)エラーが発生します。

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

したがってenable-migrations、それぞれDbContext個別に実行する必要があります。そして、Configuration.cs生成するファイルごとにフォルダを指定する必要があります...

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

DbContextにマイグレーションを追加するには、Configurationクラスの完全修飾名を指定して、次のようにします。

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

そして、あなたupdate-databaseは同じように実行します:

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

お役に立てれば。


コンテキストごとに個別の接続文字列が必要ですか、それとも回避策がありますか?
Lrayh 2014

3
同じ接続文字列を共有できます。ただし、それらが同じテーブルにマッピングされないようにする必要があります。
Anthony Chu

それらが同じテーブルにマップする場合でも、最初に実行する移行を定義し、その移行ファイルがテーブルを作成し、2番目が実行されるようにして、既存のテーブルを作成しないように変更できます。次に、各コンテキストのMigrateDatabaseToLatestVersionforzing を使用ctx.Database.initialize()して正しい順序で実行するか、Update-Databaseコマンドを正しい順序で手動で実行できます。(そして、前のバージョンへのdbマイグレーションを行う場合は逆です)。それは`sの「危険」が、行うことができます。
JotaBe 2014年

そのため、プロジェクトに移行を追加し、ApplicationDbContextとは異なるコンテキストを作成しました。約6か月間、サイトに関連するデータであるそのコンテキストを使用し続けました。それから、ApplicationUserをいじり始めるときが来ました。基本的なログインと登録は機能しましたが、ユーザークラスを拡張してフィールドを追加したいと考えていました。この回答は、そのコンテキストの新しい移行構成をセットアップするのに非常に役立ちました。ありがとうございました!#1up
Eric Bishard、2015

1
この短い説明で+10をあげられますが、答えは十分です。@ AnthonyChuに感謝します。
Karim AG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.