質問の 2 番目の部分は、リポジトリ パターンの説明に非常に近いものです。このアプローチを使用して、ユーザー固有のフィルターの挿入を強制することにより、レコードごとのアクセスの問題に対処できます。
このアプローチは、クライアントのビジネス ロジックを行ベースのセキュリティの実装から分離します。後でレコード単位のアクセスを実装する方法を変更することにした場合、変更する必要があるのはリポジトリの実装だけです。クライアントは再コンパイルする必要さえありません。
EF は、すべてのビジネス エンティティのリポジトリを部分クラスとして定義します。その上に (別のファイルで) インターフェイスを追加し、EF によって生成されたメソッドを使用してリポジトリのメソッドを実装できます。
IMyRepository {
IQueryable<ClientOrder> Orders;
IQueryable<ServiceIssue> Issues;
}
// The other part of MyRepository is EF-generated.
// Assume that EF provides properties these properties:
// - ObjectSet<ClientOrder> AllOrders
// - ObjectSet<ServiceIssue> AllIssues
public partial SecureRepository : IMyRepository {
private readonly Guid userId;
public SecureRepository(Guid userId) : this() {
this.userId = userId;
}
public IQueryable<ClientOrder> Orders {
get {
return AllOrders.Where(ord => ord.UserId == userId);
}
}
public IQueryable<ServiceIssue> Issues {
get {
return AllIssues.Where(csi => csi.UserId == userId);
}
}
}
UserId
データベースに保存する前に、注文と問題に設定する書き込みメソッドを追加できます。