0

ASP.Net環境でLINQtoSQLを何年も使用しています。UI層とBLL層はWebサービスによって分離されていたため、遅延読み込み、変更の追跡などはオプションではありませんでした。コードで何が起こっているのかを正確に知っていたので、ある意味で良かったです-BLLの変更を永続化する責任があり(エンティティが新規/更新されたかどうかを判断する)、遅延による予期しない驚きはありませんでした-どこかで読み込みが行われています。

私は今、仕事を移し、新しいデスクトップシステム(WPF)に取り組んでいます。境界はありません。つまり、UI層は直接BLLを呼び出します(ただし、最後の警告を参照してください)。EF5を使いたいのですが、EFが提供する機能やオプションなどの数に少し圧倒されます。私はいくつかの質問への答えを得ることができることを望んでいます...

  1. 遅延読み込みは境界を越えて使用する必要がありますか?顧客とそのすべての注文を表示したいとします。UIはBLLから顧客だけを要求し、遅延読み込みを使用して注文にアクセスしますか?UIでこれを行うのは、私には正しく感じられません。遅延読み込みは、BLLで使用するものにすぎないと思います。

  2. を使用して遅延読み込みをオフにできると思いますがDbContext.Configuration.LazyLoadingEnabled、BLLで遅延読み込みを使用したいのですが、エンティティをUIに戻すときに、UIに遅延読み込みを行わせたくない場合はどうすればよいですか?

  3. 変更追跡、自己追跡エンティティ、およびPOCOについてはどうですか?いつ何を使うべきですか?LINQ to SQLを使用したときは、問題にはなりませんでした(WebサービスとASP.Netにまたがっていたため、「状態」がなかったため、変更の追跡は関係ありませんでした)。すべてを非アクティブ化したいと思いますが(これは私が慣れていることです)、EFの「良さ」の一部を見逃してしまうのではないかと心配しています。永続化するデータを管理できないのではないかと心配しています。

  4. EFを使用してデータを試したり取得したりしていると、エンティティ階層の一部で、一部のプロパティコレクション(customer.Ordersなど)に「プロキシ」エンティティが含まれていることに気付きました。これらは何で、いつ役立つのでしょうか?

  5. 繰り返しますが、を介してプロキシをオフにできることに気づきましたDbContext.Configuration.ProxyCreationEnabledが、ドキュメントには、それ以上のものがあり、LazyLoadingEnabled設定と何らかの関係があることが示されていますか?

  6. EF「コードファースト」の人気が高まっているようです。それはあなたに何を与えますか?私はSSMSでデータベースを設計することに慣れており、多くのクラスやアノテーションなどを作成することはありません。

最後の注意点-アプリのUI層はBLLのメソッドを直接呼び出していますが、将来、それらを分離したい可能性がわずかにあります(たとえば、Webサービスを介して)。これは、設計上の考慮事項、および上記で提起したいくつかの質問にどのように影響しますか?

たくさんの質問をまとめてしまったことをお詫びします。私がそれらすべてに答えを得ることができれば、うまくいけば、これは将来の私の状況で他の人に役立つでしょう。

4

1 に答える 1

1
  1. 私の意見では、遅延読み込みは、BLL ではなく UI レイヤーで使用するように設計されています。これは、マスター/詳細ビューなどのデータ バインディング シナリオで特に役立ちます。UI に顧客のリストがあり、顧客をクリックすると、ユーザーは顧客の注文を表示でき、これらの注文は遅延読み込みによって読み込まれます。ユーザーがどの顧客をクリックするかは事前にわからないため、遅延読み込みを使用したくない場合 (または独自のイベント駆動型の子読み込みメカニズムを実装したくない場合) は、すべての顧客のすべての注文を事前に読み込む必要があります。 )。これにより、不要なオーバーヘッドが発生します。

    一方で、BLL での遅延読み込みが興味深い理由がわかりません。通常、特定のビジネス ロジックを実行するためにどのデータをロードする必要があるかはわかっています。それがわかっている場合は、熱心な読み込みまたは明示的な読み込みを使用できます。単にナビゲーション プロパティにアクセスして遅延読み込みに依存するよりも 1 ~ 2 行多くのコードを記述する必要がありますが、熱心で明示的な読み込みにより、コードが何を行い、いつデータベースにアクセスするかが明確になります。

    もちろん、遅延読み込みには破棄されていないコンテキストが必要であるため、UI (または UI の一部) が使用されている限りコンテキストが存続するように BLL を設計する必要があることに注意してください。

  2. UI レイヤーで遅延読み込みが必要ない場合は、それをオフにして、BLL で積極的かつ明示的な読み込みを使用します。遅延読み込みを有効にしてエンティティを読み込むと、遅延読み込みをオフにすることはできません。

  3. 自己追跡エンティティは非推奨であるか、少なくともEF チームは新しいプロジェクトでそれらを使用しないことを提案しています(2 番目の参照: http://msdn.microsoft.com/en-us/data/jj613668 )。彼らはまた、派生エンティティをもう使用しないEntityObjectことを提案しています。したがって、POCOは間違いなく進むべき道です.

    変更追跡自体は EF のコア機能であり、「スナップショット ベース」の変更追跡と変更追跡プロキシを使用した 2 つの異なる形式で POCO にも使用できます。デフォルトは、スナップショット ベースの変更追跡です。変更追跡プロキシを使用すると、特定のシナリオでのパフォーマンスを向上させることができます。特に、数千のエンティティが関与し、単一のコンテキストで更新する必要がある場合です。変更追跡プロキシの詳細については、http: //blog.oneunicorn.com/2011/12/05/should-you-use-entity-framework-change-tracking-proxies/を参照してください。

  4. 遅延読み込みまたは動的変更追跡が有効になっている場合、EF は POCO エンティティからプロキシを作成します。これらはエンティティ クラスから派生した動的オブジェクトであり、遅延読み込みと動的変更追跡 (= スナップショット ベースではない) を可能にするために必要です。

  5. ProxyCreationEnabledプロキシの作成をfalse無効にするように設定すると、動的な変更の追跡と遅延読み込みも同様に行われます。プロキシの作成がオフの場合、 の設定はLazyLoadingEnabled問題になりません。詳細はこちら: https://stackoverflow.com/a/7112470/270591

  6. データベース優先のアプローチに慣れている場合は、それを使用してください。コード ファーストでもモデル ファーストでも同様にサポートされており、EDMX ベースのアプローチとして、コード ファーストにはない高度な機能がいくつかあります。さまざまな戦略の詳細については、https ://stackoverflow.com/a/5446587/270591 をご覧ください。

...アプリの UI 層は BLL のメソッドを直接呼び出していますが、将来的にそれらを分離する可能性がわずかにあります (たとえば、Web サービスを介して)。これは、設計上の考慮事項や、上で提起したいくつかの質問にどのように影響しますか?

Web サービス境界を介してコンテキスト インスタンスを渡すことができないため、UI レイヤーで遅延読み込みを使用できなくなります。遅延読み込みは、UI が (切断された) リモート ブラウザーである Web アプリケーションと同じように役に立たなくなります。また、添付されたエンティティを追跡する変更の快適さも失われます。接続されていないエンティティとオブジェクト グラフの変更セットを構築することは、接続されているエンティティの変更追跡を利用するよりも困難です。したがって、この「わずかな可能性」が、アプリケーション設計全体に大きな影響を与える可能性があります。

于 2013-01-12T14:32:40.093 に答える