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();
}
_
質問:
usage
」ステートメントを使用しないとどうなりますか(パフォーマンスに影響するため)-GCはそのすべてを行いますか?私はEFの使用法の「新人」ですが、この質問に対する明確な答えはまだ見つかりません。
多くの人がこのスタイルのパターンを提案していると思います。私やヘンクだけではありません DBContext handling
DBContext変数を使用する適切またはベストプラクティスの方法は、Usingを使用することです。
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
利点は、多くのことが自動的に行われることです。たとえば、コードのブロックが完了すると、disposeが呼び出されます。
コンテキストのライフタイムは、インスタンスが作成されると始まり、インスタンスが破棄されるかガベージコレクションされると終了します。コンテキストが制御するすべてのリソースをブロックの最後に配置する場合は、usingを使用します。 usingを使用すると、コンパイラは自動的にtry/finallyブロックを作成し、finallyブロックでdisposeを呼び出します。