2011-08-01 18 views
1

Advocationは、Entity Frameworkでブロックを使用する場合はpopularとなりますが、this MVCのチュートリアルでは、クラスレベルで一度作成されるエンティティのオブジェクトコンテキストが表示されます。私は後者に最初に遭遇したので、私はそれを使っていました。私は今、それは本当に速いかどうかを確認するために使用したブロック方式に切り替えることをしようとしていますが、ビュー上で、このエラーに実行しています:MVC3、EF4、およびUsingブロック

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

ビューは、このによって作成されたコレクションにアクセスしようとしています。

homeView.UserList = new SelectList((from n in db.Users where n.US_INACTIVE == 0 orderby n.US_FULL_NAME select n).AsEnumerable(), "US_USER_ID", "US_FULL_NAME"); 

(それはSelectListのを使用する場合)、それを制御に移入されている必要があるとき、まだビューからオブジェクトコンテキストにアクセスしようとしている理由を私は理解していません。さらに混乱しているのは、この同じ問題がデータベースに取り込まれた他のデータでは発生しないためです。

ただし、使用ブロックからビューに適切にデータを取得するにはどうすればよいですか?または、MVCのために使うブロックを間違って使用していますが、クラスのオブジェクトコンテキストを1回だけ使用し続ける必要がありますか?

答えて

3

あなたが熱心に任意のクエリを実行するだけでクエリ式を構築していないので、あなたはおそらく、あなたの表現の末尾に.ToListを呼び出していませんでした。クエリーが暗黙的に実行されるのは一度ビューが実行されただけですが、コントローラーの寿命が終わった後もデータコンテキストが終了してからずっと時間がかかります。

これは、ドメインモデルをビューに渡すことを悪い習慣とみなしていると言われています。特定のビューの要件に合わせて特別に設計されたクラスであるビューモデルを使用する必要があります。

Ayende Rahienはビューモデルの問題についてseries of blog postsを持っています。コントローラからのビューに渡すビューモデルには、必要なすべてのプロパティが含まれていなければなりません。そして、あなたのEFデータコンテキストのライフタイムを管理するのはコントローラの責任ではありません。これは、データアクセス層(リポジトリ)固有のものでなければなりません。

+0

実際にはViewModelです。 UserListプロパティは、2番目のコードブロックに示すように、SelectListです。 AsEnumerableはクエリを実行しませんか?この例では、ToListメソッドを呼び出す方法はありますか? – Tyrsius

+0

また、リポジトリのライフタイム管理の責任という意味についてはっきりしていません。 EFがこれを管理していない場合、どのように行われますか? – Tyrsius

+0

@Tyrsius、 'AsEnumerable'はクエリを実行せず、ラムダ式から' IEnumerable 'を返します。リポジトリとは、リポジトリPattetnを意味します。それはあなたのコントローラが動作するいくつかの一般的なインターフェイスを実装して書く別のクラスです。もちろん、特定の実装(あなたの場合はEF)がDIフレームワークを使用してコントローラに注入されるので、コントローラ内ではDataContextssを管理するステートメントを使用することは決してできません。コントローラは、DataContextが何であるかを知るべきではありません... –

1

ユーザーに関連するビューで別のテーブルを使用していますか?現在のクエリでは、Usersテーブルのみが読み込まれ、関連するテーブルのデータにアクセスするとそのエラーがスローされます。

homeView.UserList = new SelectList((from n in db.Users.Include("Other Table") where n.US_INACTIVE == 0 orderby n.US_FULL_NAME select n).AsEnumerable(), "US_USER_ID", "US_FULL_NAME"); 
+0

これは非常に興味深いですが、それは問題ではありませんでした。しかし、ありがとうございます、それはおそらく将来役立つでしょう – Tyrsius