WCFを使用する場合は静的に設定することはお勧めしませんDbContext
ので、より良い使用方法があるかどうかはわかりません。そのため、データベースにアクセスするたびに作成しています。
Entity Frameworkを使用することのすべての利点を知っていると、毎回再作成するため、役に立たなくなるものもあります。DbContext
ビッグエンティティモデルを作成するプロセスを検討する必要があるため、オーバーヘッドが発生する可能性があります。
あなたの意見は何ですか?
WCFを使用する場合は静的に設定することはお勧めしませんDbContext
ので、より良い使用方法があるかどうかはわかりません。そのため、データベースにアクセスするたびに作成しています。
Entity Frameworkを使用することのすべての利点を知っていると、毎回再作成するため、役に立たなくなるものもあります。DbContext
ビッグエンティティモデルを作成するプロセスを検討する必要があるため、オーバーヘッドが発生する可能性があります。
あなたの意見は何ですか?
の単一の静的インスタンス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
のメモリ内コンテキスト)。
Web開発のベストプラクティスは「Webリクエストごとに1つのコンテキスト」のようです。適切なセッション/DbContextライフサイクル管理を参照してください。WCFを使用する場合、これは操作ごとに1つのコンテキスト(つまり、WCFメソッド呼び出しごとに1つのコンテキスト)に変換できます。
これを実現するにはさまざまな方法がありますが、おそらくさまざまな理由で推奨されない1つの解決策は、コンテキストの新しいインスタンスを作成し、それをビジネスクラスのコンストラクターに渡すことです。
public void WCFMethod()
{
using (DBContext db = new DBContext())
{
BusinessLogic logic = new BusinessLogic(db);
logic.DoWork();
}
}