web-dev-qa-db-ja.com

遅延コレクションが不要になったときに、データベースコンテキストが適切に破棄されることをどのように保証しますか?

私はここでベストプラクティスのような答えを探しています。

IDisposableを実装するクラスと対話するためのベストプラクティスはUsingステートメントを使用することを考えると、MVCでEFレイジーロードを使用するためのベストプラクティスは何ですか?

コントローラーメソッドの例:

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Using database As dataContext = New dataContext
        model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault
    End Using

    Return View(theSchedule)

End Function

この例では、モデルがビューに到着するまでにデータベース[dataContext]が破棄されるため、遅延読み込みが機能しなくなります。

だから私は質問だと思います:
MVCで遅延読み込みを使用するためのベストプラクティスは何ですか?データベースコンテキストが適切に破棄され、メモリリークが発生しないことをどのように保証しますか?

8
Sam Axe

一般に、Entity FrameworkデータコンテキストでUsingステートメントを使用する必要はありません。遅延コレクションは、その理由の1つです。したがって、コードは次のようになります。

<HttpGet>
Public Function Schedule(ByVal id As Int64) As ActionResult

    Dim model As Schedule = Nothing
    Dim database As dataContext = New dataContext
    model = (From s In database.Schedules Where s.ScheduleID = id Select s).FirstOrDefault

    Return View(model)

End Function

Entity Frameworkのデータコンテキストは、必要に応じて接続を開いたり閉じたりするように設計されており、データコンテキストオブジェクトが不要になったときに自動的に破棄されます。

DbContextのデフォルトの動作では、基になる接続は必要なときに自動的に開かれ、不要になったときに閉じられます。例えば。クエリを実行し、「foreach」を使用してクエリ結果を反復処理すると、IEnumerable.GetEnumerator()が呼び出されて接続が開かれ、後で使用可能な結果がなくなると、「foreach」がDisposeの呼び出しを処理します。列挙子で、接続を閉じます。

IDisposableについて注意する必要があるのは、データコンテキストのデフォルトの動作をOverrideする場合のみです。

参考文献

DBContextで常にDisposeを呼び出す必要がありますか?いいえ
Etity Framework 6でDbContextを適切に管理する:詳細ガイド

9
Robert Harvey