web-dev-qa-db-ja.com

「using」ステートメントのEF(エンティティフレームワーク)の使用

MVCに関するプロジェクトがあります。 DBトランザクションにEFを選択しました。 BLLレイヤーのマネージャーをいくつか作成しました。 「using」ステートメントが使用されている多くの例を見つけました。

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

ここで、DBcontext MyEntities()の新しいインスタンスを作成します。 "IDisposableオブジェクトの正しい使用を保証する" するために "using"を使用します。

それは私のマネージャーのたった一つのメソッドです。しかし、私はそれらの10以上を持っています。マネージャーからメソッドを呼び出すたびに、「using」ステートメントを使用して、メモリに別の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の使用法の「新人」ですが、この質問に対する明確な答えはまだ見つかりません。

27
Pal

多くの人がこのスタイルのパターンを提案していると思います。私やヘンクだけではありません DBContext handling

  • はい、理想的にはDBContextサブタイプのステートメントを使用します
  • Usingで管理され、コンテキストを持ち、コンテキストを破棄する、より優れた作業単位パターン 多くのUoWの例の1つ、これはTom Dykstraのもの
  • 作業単位マネージャーは、Http要求ごとに新規である必要があります
  • コンテキストはスレッドセーフではないため、各スレッドに独自のコンテキストがあることを確認してください。
  • EFにバックグラウンドで物事をキャッシュさせます。
  • コンテキスト作成時間をテストします。いくつかのHttp要求の後。まだ懸念がありますか?
  • コンテキストを静的に保存する場合、問題が発生する可能性があります。あらゆる種類の同時アクセスが損なわれ、パラレルAJAX呼び出しを使用している場合、静的な単一コンテキストを使用している場合、90 +%の問題の可能性が想定されます。

パフォーマンスのヒントについては、読む価値が十分にあります

13
phil soady

DBContext変数を使用する適切またはベストプラクティスの方法は、Usingを使用することです。

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

利点は、多くのことが自動的に行われることです。たとえば、コードのブロックが完了すると、disposeが呼び出されます。

MSDN EF DbContextの使用

コンテキストのライフタイムは、インスタンスが作成されると始まり、インスタンスが破棄されるかガベージコレクションされると終了します。コンテキストが制御するすべてのリソースをブロックの最後に配置する場合は、usingを使用します。 usingを使用すると、コンパイラは自動的にtry/finallyブロックを作成し、finallyブロックでdisposeを呼び出します。

2
Catto