37

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

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

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

4

2 に答える 2

56

生涯の管理

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

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

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


建設費

コンテキスト作成のオーバーヘッドは比較的低くなります。

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

短期間のコンテキストを操作する一般的な方法は、それをusingブロックでラップすることです。

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

テストを容易にするために、DbContextいくつかのインターフェースを実装し、コンテキストをインスタンス化IDbContextするためのファクトリクラスを作成することをお勧めします。ContextFactory<T> where T : IDbContext

これにより、任意のコードを簡単にコードにスワップできます(つまり、オブジェクトモックIDbContextのメモリ内コンテキスト)。


資力

于 2011-10-04T12:48:30.480 に答える
1

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

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

public void WCFMethod()
{
  using (DBContext db = new DBContext())
  {
    BusinessLogic logic = new BusinessLogic(db);
    logic.DoWork();
  }
}
于 2014-11-25T15:12:44.280 に答える