@jrummell は部分的にしか正しくありません。Entity Framework は、独自のデバイスに任せた場合、DbContext タイプごとに 1 つのデータベースを作成します。@NeilThompson が Julie Lerhman から言及した「境界付けられたコンテキスト」の概念を使用して、実際に同じデータベースを使用するように各コンテキストに指示するだけです。Julie のメソッドは汎用パターンを使用しているため、それを実装する各 DbContext は同じデータベースになりますが、それぞれに対して手動で行うことができます。次のようになります。
public class MyContext : DbContext
{
public MyContext()
: base("name=DatabaseConnectionStringNameHere")
{
Database.SetInitializer(null);
}
}
言い換えれば、Julie のメソッドは、この部分を自動的に処理する各コンテキストが継承できる基本クラスをセットアップするだけです。
これは 2 つのことを行います: 1) コンテキストに特定のデータベースを使用するように指示する (つまり、他のすべてのコンテキストと同じ) 2) コンテキストにデータベースの初期化を無効にするように指示します。これらのコンテキストは基本的にデータベース ファーストとして扱われるため、この最後の部分は重要です。つまり、実際にデータベースを作成したり、移行が必要であることを通知したりするコンテキストはありません。その結果、実際には、アプリケーション内のすべてのエンティティを含む別の「マスター」コンテキストが必要になります。ただし、移行の作成とデータベースの更新以外には、このコンテキストを使用する必要はありません。コードでは、より専門的なコンテキストを使用できます。
特殊化されたコンテキストで留意すべきもう 1 つのことは、各コンテキストの各インスタンス化は、エンティティを共有している場合でも、一意の状態を表すということです。たとえば、あるCat
コンテキストのエンティティは、同じ主キーを共有していても、2 番目のコンテキストのエンティティと同じではありません。Cat
最初のコンテキストからを取得してCat
更新し、2 番目のコンテキストを介して保存しようとすると、エラーが発生します。2 つの異なるコンテキストで同じエンティティを明示的に持つ可能性は低いため、この例は少し不自然ですが、外部キー関係などに入ると、この問題に遭遇することがはるかに一般的になります。明示的に宣言しなくてもDbSet
関連エンティティの場合、コンテキスト内のエンティティがそれに依存している場合、EF は暗黙的にそのエンティティを作成しますDbSet
。つまり、特殊化されたコンテキストを使用する場合、それらが真に特殊化されており、関連アイテムのどのレベルでもクロスオーバーがゼロであることを確認する必要があります。