我喜欢查询某种类型的所有查询,默认情况下包含where语句。
更确切地说,我有一个界面IIsTenantSpecific,具有属性TenantId - 所以实体属于单个租户。
当我查询实现此接口的类型时,NHIberante应该总是添加一个WHERE子句,过滤TenantId。
NHibernate中是否有一种机制(如拦截器或事件监听器)可以轻松实现这一点?
答案 0 :(得分:4)
我想说,内置功能可以轻松涵盖这种情况:
类似Q & A
来自 doc 的引用:
NHibernate增加了预定义过滤条件和附加功能 那些类和集合级别的过滤器。一个过滤器 标准是非常类似地定义限制条款的能力 到现有的“where”属性可用于类和各种 集合元素。除了这些过滤条件可以 参数。然后,应用程序可以在运行时做出决定 是否应启用给定的过滤器以及它们的参数 价值应该是。过滤器可以像数据库视图一样使用,但是 在应用程序内参数化。
为了使用过滤器,必须首先定义它们然后再附加它们 到适当的映射元素。要定义过滤器,请使用
<filter-def/>
元素中的<hibernate-mapping/>
元素:<filter-def name="myFilter"> <filter-param name="myFilterParam" type="String"/> </filter-def>
然后,此过滤器可以附加到类:
<class name="MyClass" ...> ... <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/> </class>
或者,到一个集合:
<set ...> <filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/> </set>
因此,一旦我们定义了一个过滤器,并将其应用于我们的集合 - 我们以后可以随时轻松地在整个会话中启用该过滤器:
session.EnableFilter("myFilter").SetParameter("myFilterParam", "some-value");
从那一刻起,每个集合都会在选定列
上通过“some-value”进行过滤