SQL Server 2008 データベースにロール テーブルがあり、Web サイトのコンテンツ ユーザー (たとえば、管理者、ディレクター、マネージャー、...、基本ユーザー) のさまざまなロールがあります。LINQ to Entities を使用して、アクセス許可の階層の上位に応じて、さまざまなロールのクエリ結果を取得する必要があります。
役割は直線的な階層ではなく、管理者の役割は最高の権限を持つルートですが、マネージャーやディレクターなど、上下関係なく、同じデータに対して異なる読み取り/変更権限を持つ役割があります。データは両方に表示されますが、ディレクターに対してのみ読み取り可能な一部のデータは、マネージャーによって変更可能であり、その逆も同様です。Director または Manager のサブロールであり、それぞれのデータ セットのサブセットにのみアクセスでき、より制限的な読み取り/変更権限を持つ新しいロールを追加できます。基本ユーザーは最小のロールであり、データ アクセスが最も制限されていますが、ディレクターとマネージャーの両方のサブロールでもあります (したがって、これは DAG であり、ツリーではありません)。
LINQ to Entities のナビゲーション プロパティを使用して、この DAG リレーションシップのさまざまなブランチを簡単にクエリできるようにする、データベース内のロール階層 (できれば 1 つの新しいテーブルのみ) を設計しようとしています。したがって、次のようなものがあります。
var RoleRestrictedEntities
= Entities.Where(e => e.User.Role.RoleType <= currentUserRole.RoleType);
必要に応じて、演算子の適切な置換を使用し<=
ます (LINQ to Entities で演算子のオーバーロードを実行できないことはわかっています)。RoleType がint Role.RoleType.Level
、Role の整数フィールドだけでなく、実際には独自のフィールド (例: ) を持つテーブルであっても問題ないことに注意してください。
この役割階層の基本的な目的は、データを変更できるユーザー、データを読み取り専用として表示できるユーザー、データをまったく表示できないユーザーを区別することです。より高いレベルの役割は、その下の役割を持つユーザーが作業したすべてのものを表示したり、場合によっては変更したりできます。彼らは、自分より上の役割が取り組んだデータを見ることはできません。
これは実装がかなり高速である必要があり (多くのテーブルではありません)、新しい役割を階層に挿入したり、古い役割を削除したりするのがそれほど難しくなく (これらの操作は頻繁ではありませんが、デバッグの悪夢は望んでいません)、何よりも簡単です。 LINQ to Entities を使用してロールとそのサブロールを照会します。これにどのように取り組むことができるかについて何か提案はありますか?