2010-06-16 4 views
9

J'ai une configuration de classe qui ressemble à ceci:NHibernate Many-to-one sur la sous-catégorie A rejoint avec filtre

public abstract class Parent 
{ 
    public virtual bool IsDeleted { get; set; } 
} 

public class Child : Parent 
{ 
} 

public class Other 
{ 
    public virtual ICollection<Child> Children { get; set; } 
} 

enfant est mis en correspondance en tant que joint-sous-classe de Parent. Childen est mappé en tant que sac Many-To-One. Le sac a un filtre appelé SoftDeletableFilter. La cartographie du filtre ressemble:

<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" /> 

Ce problème est que lorsque Other.Children est chargé le filtre est appliqué à la table des enfants et non la table parent. Est-il possible de dire à NHibernate d'appliquer le filtre à la classe parente?

Edit: Voici le mapping parent:

<class name="Parent"> 
    <id .. 
    <property name="IsDeleted" type="System.Boolean"> 
    <column name="IsDeleted" /> 
    </property> 
    <joined-subclass name="Child"> 
    <key> 
     <column name="ParentId" /> 
    </key> 
    ... 
    </joined-subclass> 
</class> 
+0

rencontré le même problème aujourd'hui. Avez-vous déjà trouvé une solution? – Joel

Répondre

0

vous devez ajouter le filtre à la classe parente:

<class name="Parent"> 
    <id .. 
    <property name="IsDeleted" type="System.Boolean"> 
    <column name="IsDeleted" /> 
    </property> 
    <joined-subclass name="Child"> 
    <key> 
     <column name="ParentId" /> 
    </key> 
    **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />** 
    </joined-subclass> 
    **<filter-def name="SoftDeleteableFilter" condition="(IsDeleted = 0 or IsDeleted is null)" />** 
</class> 
+0

Cela ne résout pas le problème. Si j'interroge la classe parent, les éléments supprimés seront filtrés, mais si je joins un sac à la classe enfant, ils ne seront pas filtrés. – Joel

+0

J'ai ajouté le filtre dans la sous-classe jointe, pouvez-vous tester si cela fonctionne pour vous? La documentation nhibernate donne un exemple comme celui-là pour les ensembles. – Peter

+0

'filter-def' n'est pas un élément enfant valide de joined-subclass. – Joel

1

a finalement trouvé une réponse à cela. Peut-être pas les meilleures performances d'approche amicale, mais vous pouvez réécrire votre condition de filtre en tant que sous-requête:

ParentId in (Select p.ParentId from Parent p where p.IsDeleted = false) 

Merci à CSharper sur at the usergroup pour la suggestion

Questions connexes