web-dev-qa-db-ja.com

Entity Frameworkを使用しているときにDbContextを再起動する理由

WCFを使用する場合は静的に設定することはお勧めしませんであるため、DbContextを使用するより良い方法があるかどうかはわかりません。データベースにアクセスするたびに作成しています。

Entity Frameworkを使用することのすべての利点を知っているため、毎回DbContextを再作成しているため、someは役に立たなくなります。大きなエンティティモデルを作成するプロセスを検討する必要があるため、オーバーヘッドが増える可能性があります。

あなたの意見は何ですか?

36
Boomer

寿命の管理

DbContextの単一の静的インスタンスが通常は推奨されないのは正しいことです。

ObjectContextを使用するほど、通常は大きくなります。これは、これまでに認識したすべてのエンティティへの参照を保持しているためです。基本的に、クエリ、追加、またはアタッチしたものは何でも。したがって、同じObjectContextを無期限に共有することを再検討する必要があります。

これらのコメントはDbContextをラップしてObjectContextをラップし、 "簡略化された直感的なAPI"をラップするため、直接適用されます。[ ドキュメントを参照 ]


建設費

コンテキストを作成するオーバーヘッドは比較的低いです:

実際には、このコストは実際にはかなり低くなっています。これは、ほとんどの場合、参照によってメタデータをグローバルキャッシュから新しいObjectContextにコピーするだけなのでです。通常、このコストは心配する価値がないと思います...

存続期間の短いコンテキストを処理する一般的な方法は、usingブロックでラップすることです。

using(DbContext context = new SomeDbContext())
{
    // Do work with context
}

テストを簡単にするために、DbContextIDbContextインターフェースを実装させ、コンテキストをインスタンス化するファクトリクラスContextFactory<T> where T : IDbContextを作成することができます。

これにより、IDbContextをコードに簡単にスワップできます(つまり、 object mocking のメモリ内コンテキスト)。


資源

54
Rob

Web開発のベストプラクティスは、「Webリクエストごとに1つのコンテキスト」のようです。WCFを使用する場合、 (適切なセッション/ DbContextライフサイクル管理 を参照してください)これはできます操作ごとに1つのコンテキストに変換されます(つまり、WCFメソッド呼び出しごとに1つのコンテキスト)。

これを実現する方法はいくつかありますが、1つの解決策は、おそらく異なる理由で推奨されていませんが、コンテキストの新しいインスタンスを作成し、それをビジネスクラスのコンストラクターに渡すことです。

public void WCFMethod()
{
  using (DBContext db = new DBContext())
  {
    BusinessLogic logic = new BusinessLogic(db);
    logic.DoWork();
  }
}
1
mrplatina