2012-04-25 18 views
0

私はマルチテナントアプリケーションをさまざまな企業に使用しています。私はまだこれで成功を収めています。しかし私のシナリオは、私は異なる企業(テナント)とテーブルセットを持つ単一のSQL Serverデータベースを持っています。Nhibernateテーブルの命名規則にスキーマ接頭辞を追加

私がしたいのは、マルチテナントアプリケーションの概念に従って、テーブルにそのスキーマプレフィックスを持つテーブルにアクセスするテーブルのための規約を追加することです。テナントごとにデータベースを使用していませんが、テナントごとにスキーマを使用しています。データベースファイルは1つのファイルです。

私のテーブルは、このようなものです。Sachin Sales & Service Pvt Ltd$Web User Setup Headerです。だから私はテーブルクエリが生成されるときに、クエリの前に接頭語Sachin Sales & Service Pvt Ltdを飛ばしておく必要があります。接頭辞は要件によって変わることがあります。その静的ではありません。だから私は、デフォルトでは、私は、スキーマの接頭辞を用いて所望のテーブル名を生成するには、このようなstring schemanameのような別のパラメータを渡すことができますとにかくあり、この

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     instance.Table(instance.EntityType.Name); 
    } 
} 

のように見えるIClassConventionをオーバーライドすると思いましたか?私の考えは次のようなことをすることです:

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance, string schemaname) 
    { 
     instance.Table(schemaname + instance.EntityType.Name); 
    } 
} 

私の質問はこのようになります。私は上記のポイントを達成することができる場合は、テナントの問題ごとに私のスキーマを解決するのだろうか? 2番目の場合でも、上記のオーバーライドにschemanameをどのように渡す必要があるのですか?これは単なるコンベンションで、私はそれを実際にやりたがって操作することができないので、私はどのように呼び出すべきですか?

答えて

1

nhibernateの設定時にすべてのテーブルにスキーマの使用を設定できます。

Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.DefaultSchema(sometenantsSchema)) 
+0

クウェリング中にテーブルの名前付けに接頭辞を追加するWil? – Joy

+0

これはすべてのマッピングにスキーマ接頭辞を追加します(Configurationプロパティ "default_schema"を介して、NHibernate.Cfg.Environment.DefaultSchemaを参照)。マッピングからクエリが生成されます – Firo