3

NHibernate を使用する ASP.NET MVC アプリケーションにマルチテナンシーを実装しようとしています。マルチテナンシーのデータベースを制御できますが。NHibernate を使用してデータベース クエリをフィルタリングする最良の方法を見つけようとしています。

WHERE InstanceID = 1NHibernate を使用して DB へのすべての CRUD クエリに条件 (のようなもの) を追加できる簡単な方法があるかどうかを知りたいです。

グローバルフィルターを見ました。しかし、それを正しい方法で使用しているかどうかはわかりませんでした。私はこのようなものを試しました。

NHibernateSession.GetDefaultSessionFactory().GetCurrentSession()
.EnableFilter("instance-filter").SetParameter("InstanceId", "2");

しかし、うまくいかなかったようです。NHibernate グローバル フィルターの良い例 / 条件を使用してすべての DB クエリをフィルター処理する良いアプローチを高く評価します。

4

1 に答える 1

4

私はまだ計画段階にある私の小さなプロジェクトのために同じものを探していました。私が遭遇した単一のデータベースを使用する最も完全な実装は、MichaelValentyのブログ投稿「UnityおよびNHibernateを使用したASP.NETMVCでのボルトオンマルチテナンシー:パートII –混合データ」に書かれています。彼はグローバルフィルターも使用しています。

完全を期すために、彼が使用したマッピングは次のとおりです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <filter-def name="tenant">
        <filter-param name="id" type="System.Int32" />
    </filter-def>
</hibernate-mapping>

そして、各エンティティについて:

<class name="User" table="[user]">
    <id name="Id" column="user_id">
        <generator class="identity" />
    </id>

    <property name="Username" />
    <property name="Email" />

    <filter name="tenant" condition="tenant_id = :id" />
</class>

その後、彼は選択したIoCコンテナーを使用して、パラメーター値をISessionのインスタンスに注入します。

session.EnableFilter("tenant").SetParameter("id", c.Resolve<Tenant>().Id);

実装するインターセプターもあります-エンティティを保存するときに現在のテナントIDの値を書き込み(OnSaveメソッド)、IDでエンティティをロードするときに特定のエンティティが現在のテナントに属しているかどうかを確認します(OnLoadメソッド)。OnLoadIDでエンティティをロードするときにテナントフィルターが適用されないため、オーバーライドが必要です。

于 2012-10-01T08:04:40.577 に答える