簡體   English   中英

使用ASP.NET,NHibernate / Fluent NHibernate的大多數無痛多租戶實現

[英]Most painless multi-tenancy implementation using ASP.NET, NHibernate / Fluent NHibernate

我正在嘗試在我使用的ASP.NET MVC應用程序中實現多租戶,它使用NHibernate。 雖然我可以控制數據庫以實現多租戶。 我正在嘗試找出使用NHibernate過濾數據庫查詢的最佳方法。

我想知道是否有一種無痛的方法,我可以使用NHibernate向數據庫的每個CRUD查詢附加一個條件(類似於WHERE InstanceID = 1 )。

我查看了全局過濾器。 但我不確定我是否正確使用它。 我試過這樣的事。

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

但它似乎沒有用。 NHibernate全局過濾器的任何好例子/過濾具有條件的所有數據庫查詢的任何好方法都將受到高度贊賞。

我一直在尋找同樣的事情,我的一個小項目仍處於規划階段。 我發現使用單個數據庫的最完整實現是由Michael Valenty在他的博客文章中寫的: 使用Unity和NHibernate的ASP.NET MVC中的Bolt-on多租戶:第二部分 - 混合數據 他還使用全局過濾器。

僅僅為了完整性,以下是他使用的映射:

<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方法)加載實體時檢查給定實體是否屬於當前租戶。 OnLoad覆蓋是必要的,因為在按ID加載實體時不會應用租戶過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM