6

私は ASP.NET MVC を学んでいますが、これまで読んだチュートリアルでは、私をカバーする方法で探求されていなかったいくつかの質問があります。検索してみましたが、このような質問は見当たりませんでした。それでも、既存のものを見逃している場合はご容赦ください。

多数のモデル (相互に関連するモデルと関連しないモデル) を持つ単一の ASP.NET MVC アプリケーションがある場合、 1 つの接続文字列1 つのデータベースをグローバルにDbContext使用する場合、サブクラスをいくつ作成する必要がありますか?応用?

  • すべてのモデルに 1 つのコンテキスト?
  • 関連するモデルのグループごとに 1 つのコンテキストですか?
  • すべてのモデルに対して 1 つのコンテキストですか?

答えが最初の 2 つのいずれかである場合、アプリケーション全体に対して作成されるデータベースが1 つだけであることを確認するために心に留めておくべきことはありますか? Visual Studio でローカルにデバッグすると、コンテキストと同じ数のデータベースが作成されているように見えるためです。そのため、私は 3 番目のオプションを使用していることに気づきましたが、それが正しい慣行なのか、それとも後で戻ってきて噛まれるような間違いを犯しているのかを知りたいのです。

4

3 に答える 3

5

@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。つまり、特殊化されたコンテキストを使用する場合、それらが真に特殊化されており、関連アイテムのどのレベルでもクロスオーバーがゼロであることを確認する必要があります。

于 2013-04-12T21:31:12.127 に答える