1. ホーム
  2. asp.net-mvc

[解決済み] EF 6とCode First Migrationsで同じDBとアプリケーションに複数のDB Contextsを使用する。

2023-01-30 14:45:24

質問

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

私のようなEFの新参者が理解し、使用するのに十分な詳細のある例をどなたか教えてください。

どのように解決するのですか?

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

もし、2つの DbContext があり 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.

これが役立つといいのですが。