2012-02-16 8 views
1

シンプルなフォームの3層Webアプリケーションがあります。 1つはレコードのリスト、1つは単一のレコードの編集などです。3層アプリケーションでEntity FrameworkのObjectContextをインスタンス化する必要があります

私はEDMXがあるDataLayerを持っています。 私のPOCOがあるApp Layerがあります。 私はすべてのコントローラクラス(MVCではなく!)を持つBusinessLayerを持っています 私はWeb UIがあるUIレイヤーを持っています。

EDMXには多くの多くのテーブルがあり、多くのナビゲーションプロパティがあります。 もちろん、コントローラの1つでデータを取得すると、 GetCustomerById(int id)、私はObjectのコンテキストを作成し、終了したら閉じます。

ただし、UIレイヤのナビゲーションプロパティにアクセスしようとすると、ObjectContextは有効範囲外です。

ウェブレイヤーで(using MyContext = new MyContext()) {... }を実行しますか?それは正しいとは思わない。 BizLayerのエンティティのデータから移入するPOCOの別のセットを作成する必要がありますか? ウェブフォームに入力したデータを保存するとどうなりますか?私はBizLayerコントローラを呼び出しますか? SaveCustomer()?

私の質問は、エンティティのナビゲーションプロパティに正しくアクセスできるようにするにはどうすればよいのですか。

注: EDMXはLazyLoadingに設定されています。

+0

OMGこの質問は何度も繰り返されています:)私のasnwerをここで見てください、それは究極の真実や唯一の方法ではありませんが、私はこれまで多くの合意を得ています... http://stackoverflow.com/a/7474357/559144 –

+0

ありがとうございます。しかしこれはMVCではありません。私の質問は、Web UIのEFに依存したくない場合、どのようにPOCOに対処し、どのように正しくアクセス/保存/編集するかです。 – John

+0

私の答えですべて説明されている、それはまた、WebフォームやWindowsフォームやWPF、あなたがEF、NHibernateなどの依存関係からUIを分離するようにレイヤーに適用されます... –

答えて

1

UIでレイジーローディングを使用したいのですが、それはUIがあなたのObjectContextのライフタイムを定義することを意味します。コンテキストをUIに公開せずにこれを達成する方法はたくさんあります。たとえば、次の単純なアプローチを使用することができます。

  1. コンテキストを使用してコントローラを使用しています。したがって、コントローラを使い捨てにして、すべての方法でコンテキストを廃棄する代わりに、コントローラの全寿命にわたって単一のコンテキストを使用します。コントローラのDisposeメソッドでコンテキストを破棄します。
  2. 要求ごとにコントローラをインスタンス化します。たとえば、コントローラのインスタンスをPage.Loadに作成し、Page.Unloadに配置することができます。
  3. 必要に応じてコントローラとエンティティを使用します。要求の全体処理(LoadUnloadの間)は、単一の生活の文脈の範囲内にある。

とにかく、Webアプリケーションでの遅延読み込みはあまり必要ありません。あなたのフォームでは、必要なエンティティを正確に知っているので、熱心な負荷で直接要求する必要があります。

関連する問題