私はここでベストプラクティスのような答えを探しています。
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で遅延読み込みを使用するためのベストプラクティスは何ですか?データベースコンテキストが適切に破棄され、メモリリークが発生しないことをどのように保証しますか?
一般に、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を適切に管理する:詳細ガイド