2012-03-06 14 views
7

Entity FrameworkのすべてのCRUD操作をテナントIDで自動的にフィルタリングする方法を探しています。ストアドプロシージャを使用して、テーブル値ユーザー定義関数 マルチテナントアーキテクチャ用のEntity Framework - テナントIDごとの単一テーブルのフィルタリング

  • を使用して

    • (しかし、我々はそうすることを避けるためにORMを使用しているとして、私たちは本当に、したくない:私たちは考え

      アイデアでした)

    • SQLを生成するために使用されたテンプレートを変更して、各ステートメントにwhere句を追加する方法。
    • コントローラでLINQを生成するために使用されたテンプレートを変更する方法(MVCを使用する可能性があります)。

    ヒント?

    -thanks アレックス。

  • 答えて

    13

    使用してテーブル値ユーザー定義関数

    テーブル値関数は、.NET 4.5のベータ版でのみ利用可能(および最初のコードで使用可能ではない)です。それらを使用しても、LINQのすべてのクエリで関数を使用する必要があるため、where節を使用するのと同じであるため、依然として役に立ちません。それはいくつかの特別な複雑なクエリのために役立つことができますが、一般的にそれがあるストアドプロシージャ(しかし、我々はそうすることを避けるためにORMを使用しているとして、私たちは本当に、したくない)

    を使用して

    あなたが望むものではありません。

    SQLを生成するために使用されたテンプレートを変更して、各文にwhere句を追加する方法。

    完全に異なるレベルの抽象化である。

    コントローラでLINQを生成するために使用されるテンプレートを変更する方法(MVCを使用する場合もあります)。

    理想的なソリューションに近い。

    public class MultiTenantAccess<T> where T : IMultitenant 
    { 
        private IDbSet<T> set; 
    
        ... 
    
        public IQueryable<T> GetQuery(int tenantID) 
        { 
         return set.Where(e => e.TenantID == tenantID); 
        } 
    } 
    

    時には、これは一般的なリポジトリと呼ばれるものの中核であるが、それは本当にEFセットの周りだけのラッパーです:あなたは、単に次のようになりますいくつかのコードに設定するエンティティへのアクセスをラップする必要があります。直接DbSetを使用する代わりに、GetQueryを使用してデータストアに照会します。

    +0

    でお答えします。ありがとうございます@ラディスラフ。 –

    +0

    こんにちは@ラディスラフIMultitenantに含めるべきものを視覚化するのに苦労しています。余裕があるのですか?ありがとう:-) –

    +0

    実際には、IMultitenantにはTenantIdが含まれていると思いますか?私は正しい行にいますか? –

    3

    テナントデータを異なるデータベース
    に、または同じデータベースに別々のスキーマで分割することもできます。詳細については、MSDNの記事「Multi-Tenant Data Architecture

    +1

    ありがとうオークマン、ええ、私はそれを過去に読んだことは良い記事です。当時、共有されたdb共有スキーマのみが私たちに適していましたが、私からこの質問+1でリストされる価値あるリンクです。 –

    関連する問題