我希望能有一个简单的答案……
我有一个全局过滤器,旨在避免数据库中的软删除,这在我的系统的其余部分工作正常.但是我们正在使用具有现有“UserBase”表的遗留数据库,我们需要将任何新属性添加到“User”表并映射我们的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子句忽略软删除,但它似乎被忽略了!?
正确方向的一点将非常感谢….
最佳答案 我不确定我有一个答案就像一个解决方案.而不是将User类映射到UserBase表然后加入User表,那么使用视图呢?也许您可以在数据库中创建一个名为UserView的视图,该视图将UserBase和User表连接起来,然后将User类映射到该视图.然后NHibernate应该像任何其他列一样处理IsDeleted列,并且过滤器应该可以工作.
我想到的另一个选择是将User类的映射从UserBase交换到User.然后,IsDeleted列将不再位于连接表中,而是位于连接到User的主表中.然后,过滤器不在连接表上工作的事实无关紧要.