NHibernate ‹Присоединиться /› с фильтрами

Я надеялся, что на этот вопрос будет простой ответ ...

У меня есть глобальный фильтр, предназначенный для предотвращения мягких удалений в базе данных, он отлично работает в остальной части моей системы. Однако мы используем устаревшую базу данных с существующей таблицей «UserBase», любые необходимые нам новые свойства мы добавляли в таблицу «User» и отображали наш класс User для извлечения данных. из 2 таблиц с использованием сопоставления "join" - таким образом мы не изменяем существующую таблицу "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, игнорирующим мягкие удаления, но, похоже, он игнорируется !?

Мы будем очень признательны за указание в правильном направлении ....


person kmoo01    schedule 09.03.2011    source источник


Ответы (1)


Я не уверен, что у меня есть ответ, скорее, чем работа. Как насчет использования представления вместо сопоставления класса User с таблицей UserBase и последующего присоединения к таблице User? Возможно, вы можете создать представление в базе данных с именем UserView, которое объединяет таблицы UserBase и User, а затем сопоставить User класс для этой точки зрения. Затем NHibernate должен обрабатывать столбец IsDeleted как любой другой столбец, и фильтр должен работать.

Другой вариант, который пришел мне в голову, - это поменять отображение класса User с UserBase на User. Столбец IsDeleted больше не будет в объединенной таблице, а будет в основной таблице, связанной с пользователем. Тогда не будет иметь значения тот факт, что фильтр не работает с объединенной таблицей.

person Aron Boyette    schedule 22.10.2011