2011-10-03 9 views
1

.NET MVC 3とPetaPocoを使用して共有データベースを使用してマルチテナントアプリを構築しています。 テナントID(他の情報とともに)は、ログイン時にFormsAuthクッキーに保存され、BaseControllerプロパティを介してすべてのコントローラで使用できます。ほとんどのテーブル(すなわち、メイン 'テナント'テーブルを離れて)には、テナントID列が含まれています。WHAT句を動的にペタポコと「注入」

フィーチャテーブルのすべてのCRUDに手動で 'WHERE TenantId = X'を追加するのではなく、実行する直前にこのクエリを動的に追加する方法はありますか?言い換えれば、おそらくテーブルのリストを維持し、それらのテーブルのいずれかのクエリがあれば、動的にTenantIdフィルタを追加しますか?

もちろん、フィルターを手動で追加する必要がなくなり、その結果、機会が減ります。私はexample using NHibernateを見つけました。私は再利用できるとは思っていません。違いを生む場合は、Ninjectを使用しています。

+0

あなたのアプリにどのような種類のデータを保存しようとしていますか?このように動的SQLを使用すると、セキュリティ/ SQLインジェクションのリスクがある可能性があります。 –

+0

一般的にはい、パラメータ化されたSQLを使用しています(デフォルトではPetaPocoが使用しています)。実際の質問には関係しないので、私は郵便でそれを言及しなかった。しかし、それを指摘してくれてありがとう:) – seekay

+0

良い取引。私はPetaPocoに精通していないので、私はそれを見たときに最初にひどくなりました:) –

答えて

0

データベースクラスにはOnCommandExecutingメソッドがあり、独自のサブクラスでオーバーライドして、実行前のsqlを変更することができます。この機能を使用して、isnull/nvlをSql ServerとOracle間で変換します。

あなたのSQLにマーカーを残して、ここに置き換えることができます。

+0

ありがとう - それは動作します。しかし、IDbCommandにJOINがあり、フィルタを特定のテーブルにのみ適用したい場合は、処理が複雑になる可能性があります。私がSQLでマーカを追加している場合、TenantIdフィルタを直接追加することもできます(「追加する」ことを忘れる開発者の「問題」として)。よりよい解決策がない限り、代わりにベースリポジトリにGetByTenant( 'Get'と比較して)を選ぶかもしれないと思います。ご協力いただきありがとうございます! – seekay

+0

真ですが、特定のテーブルが記述されている場合にマーカーが存在するかどうかを確認し、それ以外の場合は例外をスローすることもできます。私はまた、存在節とその節で/ * SECURITY */etcを使用してヘルパー関数を使用し、それ以外の場合は例外をスローする前にこれをチェックしています。 – Schotime

関連する問題