モデル設計に非常に深いリレーショナルツリーがあります。つまり、ルートエンティティには、より多くのコレクションを含む他のエンティティのより多くのコレクションを含むエンティティのコレクションが含まれています...他の開発者が持っているビジネスレイヤーを開発しますデータの取得/保存などの操作を実行するために使用します。
そして、このような状況に対処するための最善の戦略を考えています。エンティティを取得するときに、EFがすべての依存関係ツリーを解決することを許可することはできません。これは、多くの役に立たないJOINで終わるためです(次のレベルでそのデータが必要ないため、役に立たない可能性があります)。
遅延読み込みを無効にして、必要なものに積極的な読み込みを適用すると、期待どおりに機能しますが、他の開発者が何か新しいこと(最初は考慮されていない新しい要件や機能など)を実行しようとする
child.Parent.Id
代わりに呼び出すと、その依存関係は含まれていませんでした。これは悪いことです...しかし、これは「高速エラー」であり、すぐに修正できます。child.ParentId
NullReferenceException
遅延読み込みを有効にすると、
child.Parent.Id
代わりにアクセスすると、アクセスchild.ParentId
されるたびにDBへのスタンドアロンクエリが終了します。失敗することはありませんが、エラーがなく、パフォーマンスが低下するだけであり、すべてのコードを確認する必要があるため、さらに悪化します。
私はこれら2つの解決策のいずれにも満足していません。
nullまたは空のコレクションを含むエンティティがあるのは不満ですが、実際にはそうではありません。
EFにDBに対して任意のクエリを実行させることに満足していません。できれば一発ですべての情報を入手したいです。
だから、私は遅延読み込みを無効にし、熱心な読み込みを強制することを含むいくつかの可能な解決策を思いつきますが、どちらが良いかわかりません:
コレクションのないテーブルのデータを含むクラスを作成できるため
EntityBase
、コレクションにアクセスできません。また、関係を含む具体的な実装では、C#では多重継承が許可されていないため、柔軟性があまりないという問題があります。そのメソッド呼び出しで使用できないプロパティを隠すオブジェクトを「マスク」するインターフェイスを作成できます。たとえば、プロパティがある場合
User.Roles
、グリッドにすべてのユーザーを表示するために、プロパティを解決する必要がないため.Roles
、そのようなプロパティを含まないインターフェイス「IUserData」を作成できます。
NullReferenceException
しかし、この追加の作業に価値があるかどうかはわかりません。「このプロパティがロードされていません」という高速表示で十分かもしれません。
プロパティが仮想であり、オーバーライド/設定されていない場合、特定の例外タイプをスローすることは可能でしょうか?
どのような方法を使用していますか?
ありがとう。