2012-04-20 18 views
1

単純な(またはそうでない)データアクセスコントロールをEntity Frameworkで作成したいと考えています。 EFは実際にはスキーマやビューを適切にサポートしていないため、EFでそれほど簡単にサポートされていないことがわかりました。エンティティフレームワークのデータアクセス制御

エンティティの一部の列に条件付きでアクセスしたいです。

Sql Serverでは、スキーマを使用して簡単に達成できます。たとえば、いくつかの列が欠落しているスキーマでユーザーのビューを作成できます。他のユーザー(adminなど)は、スキーマ内のすべての列を持ちます。どちらもビューの同じ名前を持つことができます。たとえば、getUsersですが、dboスキーマ(dbo.getUsers)からadminを実行するのはadminだけで、すべての列とそれ以外のものがあります。もちろん、SQL Serverではストアドプロシージャによっても実現できます。

EFでデータアクセスの機能をどのように達成できますか?

私はこのように使用することができます機能を作りたい:もちろん

-- function checks user role and returns appropirate columns/entity 
var result = getAppropirateDataForThisUser("getUsers", user); 

それが唯一の問題を説明することです。使用方法はまったく異なる場合があります。条件付きのフィルタリングの目的は何

答えて

0

あなたができることの一つは、関連するユーザーのために列をフィルタリングするためのロジックとラッパーローバーDbContextを作成することで、

public class EfWrapper:Context 
{ 
private DbContext _dbContext; 

public EfWrapper(DbContext context){ 
    _dbContext=context; 
    } 

    public IEnumerable <User> getUsers(User user){ 

     //if ... write your logic to choose correct projection 
      var users= from user in context.Users 
      select new UserWithLessColumns 
       { 
        id= user.Id, 
        Name= user.Name 
       }); 
     return users; 
} 
} 
+0

私は多くのエンティティ/ビュー/プロシージャを持っている場合、それを使って作業するのは非常に難しいかもしれません。単純な解決策はありませんか?オブジェクトごとにメソッドを実装することは悪い考えです。私はむしろストアドプロシージャまたはビューでDBサイトの列をフィルタリングするだろう... – nosbor

+0

その場合..はい。私はあなたがデータベース側でそれを必要と思う。 –

+0

[OK]を、しかし私はEFでそれを処理できますか?私はdb.ExecuteStoreQueryでそれをやろうとしました(@ "execute" + schema + "。" + procName);しかし、私が少ない列を受け取ったスキーマからプロシージャを実行すると、このキャストを実行するのに十分な列がないという例外がスローされます。 – nosbor

0

?表示用の場合は、上位のアプリケーション層でそれを処理します。実際に別のビジネスオブジェクトについて話している場合(つまり、あるユーザーがあるタイプのオブジェクトを取得し、別のユーザーがそのオブジェクトのサブタイプを取得した場合)、異なるクラスを作成してそれらのクラスのマップを作成し、 EFテクニック

EFは、データアクセスコンポーネント、具体的にはオブジェクトリレーショナルマッパーです。つまり、データベースデータをビジネスオブジェクトにマップします。

+0

はい、正しく理解しています。どうすればいいですか? – nosbor

+0

異なるビジネスオブジェクトを公開しようとしているか、または表示をフィルタリングしようとしていますか? –