NHibernate <join> with filters </join>

时间:2011-03-09 10:06:02

标签: .net nhibernate join filter

我希望能有一个简单的答案......

我有一个全局过滤器,旨在避免数据库中的软删除,这在我的系统的其余部分工作正常。但是,我们正在使用具有现有“ 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>

有什么方法可以让过滤器应用于“已加入”表而不是类表?

我还尝试在“join”映射中指定一个“subselect”,其中where子句忽略软删除,但它似乎被忽略了!?

非常感谢正确方向的一点......

1 个答案:

答案 0 :(得分:2)

我不确定我是否有一个解决办法。而不是将用户类映射到 UserBase 表,然后加入 User 表,那么使用视图呢?也许您可以在数据库中创建一个名为 UserView 的视图,该视图已连接 UserBase User 表,然后映射用户对该视图的类。然后NHibernate应该像任何其他列一样处理 IsDeleted 列,并且过滤器应该可以工作。

我遇到的另一个选择是将用户类的映射从 UserBase 交换到用户。然后, IsDeleted 列将不再位于已连接的表格中,而是位于连接到用户的主表格中。然后,过滤器不在连接表上工作这一事实并不重要。