我正在尝试在我拥有的使用 NHibernate 的 ASP.NET MVC 应用程序中实现多租户。尽管我可以控制多租户数据库。我正在尝试找出使用 NHibernate 过滤数据库查询的最佳方法。
我想知道是否有一种轻松的方法可以附加条件(例如WHERE InstanceID = 1
)到使用 NHibernate 对数据库的每个 CRUD 查询。
我查看了全局过滤器。但我不确定我是否以正确的方式使用它。我尝试过这样的事情。
NHibernateSession.GetDefaultSessionFactory().GetCurrentSession()
.EnableFilter("instance-filter").SetParameter("InstanceId", "2");
但这似乎不起作用。任何 NHibernate 全局过滤器的好例子/任何使用条件过滤所有数据库查询的好方法都将受到高度赞赏。
我一直在为我的一个仍处于规划阶段的小项目寻找同样的东西。我遇到的使用单个数据库的最完整的实现是由迈克尔·瓦伦蒂 http://www.agileatwork.com/在他的博客文章中:使用 Unity 和 NHibernate 的 ASP.NET MVC 中的附加多租户:第二部分 – 混合数据 http://www.agileatwork.com/bolt-on-multi-tenancy-in-asp-net-mvc-with-unity-and-nhibernate-part-ii-commingled-data/。他还使用全局过滤器。
为了完整起见,以下是他使用的映射:
<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
override 是必要的,因为按 id 加载实体时不会应用租户过滤器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)