我想实现一个ASP.NET MVC应用程序,我有,使用NHibernate的多租户。 虽然我已经在数据库多租户控制。 我试图找出使用NHibernate来过滤数据库查询的最佳方式。
我想知道是否有一个无痛的方式,我可以附加一个条件(类似WHERE InstanceID = 1
)每一个CRUD查询数据库使用NHibernate。
我看着全局过滤器。 但我不知道如果我用正确的方式。 我想是这样的。
NHibernateSession.GetDefaultSessionFactory().GetCurrentSession()
.EnableFilter("instance-filter").SetParameter("InstanceId", "2");
但它似乎并没有工作。 NHibernate的的全局过滤器的任何好的例子/筛选符合条件的所有的数据库查询的任何好的方法将高度赞赏。
我一直在找我的一个小项目,该项目仍处于规划阶段同样的事情。 使用我来到由写入单个数据库的最完整的实现迈克尔Valenty在他的博客: 用螺栓固定的多租户在ASP.NET MVC使用Unity和NHibernate:第二部分-混合数据 。 他还使用全局过滤器。
只是为了完整起见,这里是他使用的映射:
<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加载实体时,租户过滤器将不会被应用。
文章来源: Most painless multi-tenancy implementation using ASP.NET, NHibernate / Fluent NHibernate