2

マルチテナント データベース、つまり複数のクライアントで使用される共通データベースがあるため、各テーブルにはテナントを示す「ClientID」列があります。私たちは ORM に Fluent NHibernate を使用しており、マルチテナンシーに取り組むための最良のアプローチを探しています。各 Mapping クラスは ClientID をマップする必要がありますが、値はユーザー アカウント オブジェクト (つまり、何らかのユーザー セッション) から取得されます。

Fluent NHibernate を使用してこれを達成する簡単で簡単な方法はありますか? もしそうなら、例を挙げていただけますか?

4

1 に答える 1

1

これがあなたの求めているものかどうかは完全にはわかりませんが、各クラスを ClientId にマップする必要がある場合の例を次に示します。

基本的に、各クラスには UserAccount プロパティ、または ClientId プロパティを持つユーザーのアカウント情報を格納するクラスがあります。次に、Fluent NHibernate マッピングで、References() メソッドを使用してクラスを一緒にマップできます。以下の例を参照してください。

public class UserAccount
{
    public virtual int Id { get; set; }

    public virtual string Name { get; set; }

    public virtual IList<Bill> Bills { get; set; }
}

public class Bill
{
    public virtual int BillId { get; set; }

    public virtual UserAccount User { get; set; }
}

public class UserAccount : ClassMap<UserAccount>
{
    public UserAccount()
    {
        Id( x => x.Id ).Column( "ClientId" );

        Map( x => x.Name );

        HasMany( x => x.Bills );
    }
}

public class BillMap : ClassMap<Bill>
{
    public BillMap()
    {
        Id( x => x.Id ).Column( "BillId" );
        References( x => x.User ).Column( "ClientId" );
    }
}

そのため、Bill テーブルには ClientId 列があり、これはデータベース用語では実際には UserAccount テーブルの主キー列を参照する外部キーであり、ClientId とも呼ばれます。

本当に大量のテーブルがあり、そのすべてに ClientId 列が含まれている場合は、エンティティが継承する基本クラスにそれを抽象化し、既に UserAccount プロパティを持っているオプションもあります。Fluent NHibernate マッピング ファイルに対しても、同じ基本クラスのアプローチを行うことができます。

于 2012-08-03T06:32:51.827 に答える