デフォルトのスキーマを設定してコンテキストを区別する
EF6 では、複数のコンテキストを持つことができます。派生クラス (Fluent-API 構成がある場所)のOnModelCreating
メソッドで、既定のデータベース スキーマの名前を指定するだけです。DbContext
これはEF6で機能します:
public partial class CustomerModel : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("Customer");
// Fluent API configuration
}
}
この例では、データベース テーブルのプレフィックスとして ("dbo" ではなく) "Customer" を使用します。さらに重要なことに、__MigrationHistory
テーブルの前にプレフィックスも付けられますCustomer.__MigrationHistory
。__MigrationHistory
したがって、コンテキストごとに 1 つずつ、1 つのデータベースに複数のテーブルを含めることができます。したがって、1 つのコンテキストに加えた変更が他のコンテキストを台無しにすることはありません。
移行を追加するときは、構成クラスの完全修飾名 (から派生) をコマンドDbMigrationsConfiguration
のパラメーターとして指定します。add-migration
add-migration NAME_OF_MIGRATION -ConfigurationTypeName FULLY_QUALIFIED_NAME_OF_CONFIGURATION_CLASS
コンテキストキーについて一言
この MSDN の記事「Chapter - Multiple Models Targeting the Same Database 」によると、テーブルには移行を区別するためのContextKeyMigrationHistory
列があるため、テーブルが1 つしか存在しない場合でも、EF 6 はおそらく状況を処理します。
MigrationHistory
ただし、上記のようにデフォルトのスキーマを指定して、複数のテーブルを持つことを好みます。
個別の移行フォルダーの使用
このようなシナリオでは、プロジェクト内の別の "Migration" フォルダーを操作することもできます。プロパティDbMigrationsConfiguration
を使用して、それに応じて派生クラスを設定できます。MigrationsDirectory
internal sealed class ConfigurationA : DbMigrationsConfiguration<ModelA>
{
public ConfigurationA()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @"Migrations\ModelA";
}
}
internal sealed class ConfigurationB : DbMigrationsConfiguration<ModelB>
{
public ConfigurationB()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @"Migrations\ModelB";
}
}
概要
全体として、プロジェクト内のコンテキスト、移行フォルダー、データベース内のテーブルなど、すべてが明確に分離されていると言えます。
より大きなトピックの一部であるが、(外部キーを介して) 互いに関連していないエンティティのグループがある場合、私はそのようなソリューションを選択します。
エンティティのグループが互いに何の関係もない場合は、それぞれに個別のデータベースを作成し、おそらく各プロジェクトで 1 つのコンテキストを使用して、異なるプロジェクトでそれらにアクセスします。