2012-02-29 11 views
1

私は以下のような構造のプロジェクトを持っています: .Peristence - > .Repo - > .Services - > .Controllers - > MVC3 App。EF4:遅延読み込みを有効にすると、プロキシ作成を有効にする必要があるのはなぜですか?

各レイヤーにはそれぞれインターフェイスがあるアセンブリがあります。また、.Entities、.ViewModels、および共通コードアセンブリなどのアセンブリもあります。

永続性 - これは、EF4 datacontext(コードファースト)とEF4.3への参照を保持します。 GetContext()というContextを作成するためのファクトリがあり、このファクトリはIDisposableを実装しています。それは私がWindsorがLifestyleSingleton()と私のために何をするのだろうと思ったので、シングルトンの原因ではありません。
Repo - これは、リポジトリと仕様パターン(http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/)を実装するリポジトリを保持します。
1.なぜプロキシ作成が遅延ロードが有効になっている場合に有効にする必要もありません:

他の層は自明...

質問ありますか?
2. lazyloading = falseを設定したい場合は、そこに.Include()を使用するために、IEnumerableをサービス層にObjectQueryにキャストできますか?

答えて

4

遅延ロードが有効な場合にプロキシ作成を有効にする必要があるのはなぜですか?

POCOを使用した遅延読み込みはプロキシ作成に依存しているためです。プロキシを使用しない場合、遅延ロードは機能しません。従って、ProxyCreationEnabled = falseLazyLoadingEnabled = trueの組み合わせは意味をなさない。リバースの組み合わせは、変更トラッキングプロキシで作業したいが遅延ロードを使用したくない場合に便利です。

lazyloading = falseを設定したい場合は、サービス層のIEnumerableをObjectQueryにキャストして.Include()を使用できますか?

それはあなたが本当にIEnumerable<T>が何であるかに依存します。 ToList()の場合はList<T>IEnumerable<T>の実装ですが、IQueryable<T>の実装ではありません。 IQueryable<T>IEnumerable<T>と返すと、おそらくIQueryable<T>にキャストできます。 (EF 4.3では、ObjectQuery<T>ではなくIQueryable<T>またはDbQuery<T>を使用します)。

しかし、このようなキャストが必要な場合は、アーキテクチャに何か問題があることが示されます。 Includeを使用すると、クエリが変更されます。サービス層がクエリを変更できる場合、リポジトリはIQueryable<T>を返さなければなりません。このタイプはクエリの作成と変更のために作られています。

IQueryable<T>を返すようにリポジトリが指定されていない場合は、Includeをクエリに追加するために使用する式または仕様をリポジトリメソッドに渡す必要があります(サービスレイヤではなくリポジトリメソッド内)。

+0

ありがとうございました。サービス層でのインクルードを使用しないことに関して私はあなたに同意します。 ObjectQueryのDbQuery isnteadを使用する限り、DbQueryにはない理由が分かりますか。where(string)は、 "it.ID> 2"のようなエンティティsql値をとるオーバーロードですか?また、私は、System.Data.Entity名前空間(フレームワークの一部)にあるObjectQueryを使用すると、私はRepoプロジェクトでEntityFramework(約2MB)を参照する必要はありません。 DbQueryの代わりにObjectQueryを使用することに不利な点はありますか? – diegohb

+1

@diegohb:Entity SQLは 'DbContext'ではサポートされていません。そのため、' Where'の文字列オーバーロードはありません。 'ObjectQuery'を使いたいのであれば、' IObjectContextAdapter'を使って 'DbContext'から' ObjectContext'を引き出すことができます(あなたはそれを知っていますか?)。しかし、本当にEntity SQLを使いたいのでなければ、 'DbContext'を使い、EntityFramework.dllへの参照を入れることをお勧めします。さもなければ 'DbContext'を全く使用する理由はありません。あなたはEF 4.0を使うことができます。 – Slauma

+0

ありがとう!はい、私はobjectcontextadapterについて知っていました。私のUIはjqGridコンポーネントを使用しており、フィルタリング機能を提供しています。フィルタリングパラメータを文字列クエリに変換してサービスに渡す予定です。サービスに渡すには、Repo(ObjectContextAdapterとDbContextにアクセスする必要があります)に渡す必要があります。 ESQLを使用するためのオーバロードここでは、EntityFramework.dllに対するUIのハードリファレンスを作成したくないだけです。このオーバーロードを使用するには、DbContextを使用することをお勧めします。 huyruaのリンクを見たことがあるなら、ImはすべてのGenericRepoメソッドをオーバーロードする必要があります。 – diegohb

関連する問題