Entity Framework 4 で ASP.NET MVC3 を使用しています。
Unit Of Work + Generic Repository パターンを使用しています。
どこでも同様の質問を検索しましたが、多くの人が私の問題を抱えていることがわかりましたが、それでも適切で実用的な解決策が見つかりません。
マルチテナント データベースがあります。
同様の構造を持つデータベースを想像してください。
- 顧客
- 顧客に関連付けられたグループ
- 1 つまたは複数のグループに関連付けられたユーザー
そして、私たちが持っている顧客ごとに
- リソース、1 つまたは複数のグループに関連付けられ、外部キー、多対多の関係などで相互にリンクされている
そのため、ユーザーがログインすると、1 つまたは複数のグループに関連付けられ、そのグループに関連付けられた親リソースと子リソースにアクセスできる必要があります。
問題は次のとおりです。
ログインしたユーザーの ID に基づいて、.Where() 句を使用して、リポジトリ内の作業単位に一種の事前フィルタリングを実装しました。
そして、これは機能しています。
リポジトリで行った事前フィルタリングは正常に機能していますが、もちろん、TYPE A、TYPE B、TYPE C などのソースのリポジトリに直接アクセスする場合にのみ機能します。
ただし、リソースは、多対多のテーブルと外部キーを使用して他のリソースにリンクされています。
そのため、ユーザーがアクセスできるグループにリソースが属している場合でも、このリソースにリンクされているリソースが、ユーザーがアクセスできないグループに属している場合があります。
「親」リソースのナビゲーション プロパティをトラバースすると、ユーザーはリンクされたすべてのリソースにアクセスできます。他のグループに属するリソースも含まれます。
そのため、TYPE A リソースから開始し、ナビゲーション プロパティをたどって TYPE B および TYPE C リソースに到達する場合、それらはフィルタリングされません。
TYPE B および TYPE C リポジトリにアクセスすると、それらはフィルタリングされます。
前に述べたように、フィルターは Unit Of Work クラスにありますが、それらをカスタム DBContext に移動して、フィルターを DBSet に直接適用しようとしましたが、何も変わりません。
EF はナビゲーション プロパティを構築するためにデータベースに直接アクセスしているようです。そのため、他のリポジトリや他の DBSet を使用せず、プレフィルターを回避しています。
私たちは何ができる?
NHibernate には私のタスクを達成できるグローバル フィルターがあることがわかったので、EF から NH への移行を検討しています。
他の多くの人が .Include() フィルターを要求しているため、遅延読み込みが無効になっていることがわかります。
ありがとうございました。
必要に応じてコードを提供できますが、問題を正しく説明できれば幸いです。
ありがとうございます
よろしくお願いします、
マルコ