Asp.net mvc 使用ASP.NET、NHibernate/Fluent NHibernate实现最轻松的多租户

Asp.net mvc 使用ASP.NET、NHibernate/Fluent NHibernate实现最轻松的多租户,asp.net-mvc,nhibernate,fluent-nhibernate,multi-tenant,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Multi Tenant,我正在尝试在一个ASP.NETMVC应用程序中实现多租户,该应用程序使用NHibernate。虽然我可以控制多租户的数据库。我试图找出使用NHibernate过滤数据库查询的最佳方法 我想知道是否有一种无痛的方法,可以使用NHibernate将条件(比如where InstanceID=1)附加到数据库的每个CRUD查询中 我查看了全局过滤器。但我不确定我是否用对了。我试过这样的东西 NHibernateSession.GetDefaultSessionFactory().GetCurrentS

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

我想知道是否有一种无痛的方法,可以使用NHibernate将条件(比如
where InstanceID=1
)附加到数据库的每个CRUD查询中

我查看了全局过滤器。但我不确定我是否用对了。我试过这样的东西

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

但它似乎不起作用。任何NHibernate全局过滤器的好例子/任何过滤带有条件的所有DB查询的好方法都将受到高度赞赏。

我一直在为我的一个仍处于规划阶段的小项目寻找同样的东西。我遇到的使用单个数据库的最完整实现是在他的博客文章中写的:。他还使用全局过滤器

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

<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);
session.EnableFilter(“租户”).SetParameter(“id”,c.Resolve().id);

还有一个拦截器要实现——保存实体时写入当前租户id的值(
OnSave
方法),并在按id加载实体时检查给定实体是否属于当前租户(
OnLoad
方法)<代码>OnLoad重写是必要的,因为按id加载实体时不会应用租户筛选器。

谢谢Miroslav。看起来确实不错。与我的谷歌研究结果不同。因为我的多租户实现需要一些时间(在这里我需要考虑性能问题,而不是什么)。我会打开这条线,看看答案会指向哪里。一旦我在NH全局过滤器和拦截器的基础上实现工作,我会将你的帖子标记为答案。再次感谢!没问题。如果您能够在(希望)实施此方法后与他人分享您的经验,那也将非常棒:)