21

私はMVCでプロジェクトを持っています。私たちはDB取引のためにEFを選択しました。私たちは、BLL層のマネージャーをいくつか作成しました。私たちはDBcontext MyEntities()の新しいインスタンスを作成します。ここEF(エンティティフレームワーク) "using"ステートメントの使用

public Item GetItem(long itemId) 
    { 
     using (var db = new MyEntities()) 
     { 
      return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
     } 
    } 

すなわち

、「 using」文が使用されている例の多くは、発見しました。 "ensure the correct use of IDisposable objects."

私のマネージャーでは1つの方法です。しかし私には10以上のものがあります。 マネージャからメソッドを呼び出すたびに、私は "using" statemantを使用し、 メモリに別のDBcontextを作成します。ガベージコレクタ(GC)がそれらを処分するとき?知るか?

しかし、マネージャメソッドの別の使用方法があります。 私たちは、グローバル変数を作成:

private readonly MyEntities db = new MyEntities(); 

をし、「using」文なしであらゆる方法でDBcontextを使用しています。そして、この方法は、次のようになります。

public Item GetItem(long itemId) 
{ 
    return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
} 

質問:

  1. DBcontext変数を使用しての適切な方法は何ですか?
  2. "usage"ステートメントを使用しないと(パフォーマンスに影響するため) - GCはそれをすべて行いますか?

私はEF使用の "ルーキー"ですが、この質問の一義的な答えはまだ見つかりませんでした。

+0

あなたがそれをどれくらい遠くにしたいかによって異なります。理想的にはあなたのコントローラーでそれをインスタンス化するのではなく、**コントローラを呼び出すコントローラ(Factory)がContextの存続期間を決定できるように**注入(IoC/DI)します。 – Belogix

+0

なぜパフォーマンスに影響しますか?あなたはそれを測定して、あなたがパフォーマンスを失っていると結論づけましたか? GCはそれを処理していないので、使用しているステートメントを使用しているので、自分で処分しています。 – Maarten

答えて

11

私はこのパターンのスタイルを示唆するものがたくさんあると思います。だけでなく、私やヘンク・ コンテキストを持ってDBContext handling

  • 使用して管理されている作業パターンのはい、理想的にはDBContextサブタイプ
  • ためのステートメントを使用してさらに良いユニット、およびコンテキストにJust 1 of many UoW examples, this one from Tom Dykstra
  • を配置ユニット各ワークフローマネージャは新しいHttpリクエストである必要があります
  • コンテキストはスレッドセーフではありませんので、各スレッドが独自のコンテキストを持っていることを確認してください。
  • EFで舞台裏をキャッチするようにしましょう。
  • コンテキストの作成時間をテストします。いくつかのHTTPリクエスト後。あなたはまだ心配していますか?
  • コンテキストを静的に保存すると問題が発生する可能性があります。任意の並行アクセスが害になります。また、並列AJAX呼び出しを使用している場合は、静的単一コンテキストを使用している場合、90%以上の問題が発生する可能性があります。

For some performance tips, well worth a read

+1

ちなみに、「Julie Lermanのこの1つは、多くのUoWの例のうちの1つだけです」とTom DykstraはJulie Lerman氏ではありません。 –

+0

Paulの修正Paul –

1

DBContext変数を使用しての適切やベストプラクティスの方法は、使用しています。

using (var db = new MyEntities()) 
    { 
     return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); 
    } 

多くのことが自動的に行われます。たとえば、コードのブロックが完了すると、disposeが呼び出されます。インスタンスが作成され、インスタンスが配置され、またはガベージコレクションのいずれかである場合 が終了したときMSDN EF Working with DbContext

当たり

コンテキストの寿命が始まります。コンテキストが制御するすべてのリソースを ブロックの最後に配置する場合は、 を使用してください。 usingを使用すると、コンパイラ が自動的にtry/finallyブロックを作成し、 finallyブロックでdisposeを呼び出します。

関連する問題