2011-03-09 54 views
4

我希望会有一个简单的答案,这一个....NHibernate的<Join/>有过滤器

我有一个全球性的过滤器设计,以避免在数据库软删除,这工作正常在我的系统的其余部分。然而,我们使用的遗留数据库与现有的“UserBase”表,我们需要的任何新属性添加到“用户”表中,并映射我们的User类以使用“join”映射从2个表中检索数据 - 这样我们就不会改变现有的“UserBase”表。

再次说明,此工作正常,直到我们尝试将软删除过滤器应用于该类为止 - 因为生成的SQL将过滤器应用于没有匹配列的“BaseUser”表。

<class name="User" table="UserBase"> 
    <id name="Id" column="userid" type="Int32" unsaved-value="-1"> 
     <generator class="native"> 
      <param name="sequence"></param> 
     </generator> 
    </id> 
    <property name="Email" column="UserEmail" type="String" length="100" /> 
    ......... 
    ......... 
    <join table="User" optional="false"> 
    <key column="UserID" /> 
    <property name="TimeZone" column="timezone" type="Int32" /> 
    ......... 
    ......... 
    <property name="IsDeleted" column="IsDeleted" type="Boolean" /> 
    </join> 

    <filter name="AvoidLogicalDeleted" condition="IsDeleted = 0" /> 
</class> 

有什么办法可以让我的过滤器适用于“加入”表,而不是类表?

我也试图在“连接”映射中指定一个“子选择”,其中的where子句忽略了软删除,但它似乎被忽略!

在正确的方向某点,将不胜感激....

回答

2

我不知道我有一个答案这么多,因为周围的工作。除了将用户类映射到UserBase表,然后加入到用户表,那么使用视图怎么样?也许你可以创建一个名为用户视图数据库它具有用户群用户表连接的视图,然后用户类映射到了这一观点。然后NHibernate应该像处理任何其他列一样处理IsDeleted列,并且过滤器应该工作。

是发生在我的另一种选择是从用户群交换用户类的映射用户IsDeleted列将不再处于连接表中,而是连接到用户的主表中。那么,过滤器不在联接表上工作的事实将无关紧要。