2

データストレージにEntityFramework4.1CodeFirstを使用するプロジェクトがあります。EFがリポジトリパターンの背後に抽象化されるようにコーディングされました。エンティティがリポジトリからフェッチされると、データセットには、フェッチする必要のあるすべての関連エンティティを通知するインクルード文字列の膨大なリストが渡されます。これにより、データベースにデータがない場合でも、実行に10秒かかる可能性のある非常に大きなクエリが発生します。

データベースにアクセスするためにリポジトリを使用して記述されたコードはすでにたくさんあります。パターンを壊すことなく、理想的にはパフォーマンスを向上させる必要があります。

データベースを検索するときに、インクルード文字列がデータセットに渡されないように(または最小限のインクルード文字列だけが)渡されるように変更しようとしています。エンティティがデータベースからフェッチされると、それらの関連エンティティは、最初にアクセスされたときに遅延読み込みによって読み込まれます。

次のようなナビゲーションプロパティを持つDonationというクラスがあります。

public virtual Employee Donor { get; private set; }

DonationクラスとEmployeeクラスの両方に、パラメーターのないプライベートコンストラクターがあります。インクルード文字列「Donor」を使用すると、寄付のリストを取得でき、寄付が添付された状態で返されます。

インクルード文字列なしでリポジトリから寄付をフェッチすると、通常、ドナーはnullとして返されます。偶然にも、問題の従業員としてログインしている場合、システムの他の場所にある別のクエリで、従業員リポジトリから従業員エンティティが既にフェッチされています。この場合、従業員が正しく設定された状態で寄付が返されます。したがって、以前のクエリからすでにデータが利用可能である場合、データは明らかに「遅延読み込み」されています。しかし、一般的に、私はドナーと他のすべてのエンティティについてはまだ問い合わせていません。

誰かが私が間違っている可能性があることを提案できますか?長い質問でごめんなさい。必要に応じてコードをさらに投稿できますが、まったく異なります。前もって感謝します!

4

1 に答える 1

4

このページhttp://msdn.microsoft.com/en-us/library/dd468057.aspxのガイドラインに従えば、目的の結果が得られるはずです。特に、パラメーターなしのコンストラクターを保護することで、役立つはずです。

ただし、残りのガイダンスをご覧ください。

于 2012-04-26T16:18:19.207 に答える