3

我正在尝试在我拥有的使用 NHibernate 的 ASP.NET MVC 应用程序中实现多租户。虽然我可以控制多租户的数据库。我试图找出使用 NHibernate 过滤数据库查询的最佳方法。

我想知道是否有一种无痛的方式,我可以WHERE InstanceID = 1使用 NHibernate 将条件(类似于)附加到每个 CRUD 查询到数据库。

我查看了全局过滤器。但我不确定我是否以正确的方式使用它。我尝试过这样的事情。

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

但它似乎没有用。NHibernate 全局过滤器的任何好的例子/过滤所有数据库查询的任何好的方法都将受到高度赞赏。

4

1 回答 1

4

我一直在为我仍在规划阶段的一个小项目寻找同样的东西。我遇到的使用单个数据库的最完整实现是由Michael Valenty在他的博客文章中编写的:使用 Unity 和 NHibernate 的 ASP.NET MVC 中的螺栓固定多租户:第二部分 - 混合数据。他还使用全局过滤器。

只是为了完整起见,以下是他使用的映射:

<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的值,并在通过id(方法)OnSave加载实体时检查给定实体是否属于当前租户。覆盖是必要的,因为在通过 id 加载实体时不会应用租户过滤器。OnLoadOnLoad

于 2012-10-01T08:04:40.577 回答