0

BL と Entity Framework DAL の間にミドルウェア層を作成し、アプリケーションのユーザー権限ビジネス ロジックによってデータをフィルター処理しました。私のレイヤーは、「フィルタリングされていない ObjectSet」のインスタンスを持つ IObjectSet を実装しており、ObjectSet が使用されているときは常にフィルター式が実行されています。メソッド「インクルード」の代わりに、すべての作業格子。「フィルタリングされていない ObjectSet」を ObjectQuery に変換し、ObjectQuery.Include メソッドを使用する拡張メソッドを作成するソリューションを見つけましたが、このソリューションは権限フィルタリングのバイパスを引き起こす可能性があります。

public IQueryable<TEntity> Include<TJoin>(string path)
    {
        if (_nonAuthorizedObjectSet is ObjectQuery<TEntity>)
        {
            var result = ((ObjectQuery<TEntity>)_nonAuthorizedObjectSet).Include(path);
            return result as IQueryable<TEntity>;
        }
    }

例えば:

テーブル名「アイテム」には列 {Item_Id,Owner,Item_Type_Id} があります。このテーブルには、所有者==ユーザーであるアイテムのみをユーザーが表示できる権限ロジックがあります。テーブル「Item_Types」には権限ロジックがありません。

実行することにより: PermittedDAL. Items.ToArray() – current_user==Owner であるアイテムのみを取得します。Item_Types.Include("Items") 問題!! - すべてのアイテムを取得します。

ありがとう

4

1 に答える 1

0

EF は、積極的にロードされたレコードのフィルタリング (インクルード) をサポートしていません。メイン レコードのみをフィルタリングできます。リレーションをフィルタリングする必要がある場合は、カスタム プロジェクションを使用するか、リレーションごとに個別のクエリを使用する必要があります。

于 2011-11-04T13:48:07.460 に答える