2010-06-16 6 views
9

Ho una configurazione di classe che sembra qualcosa di simile:NHibernate Molti-a-uno sulla sottoclasse Registrato con filtro

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

public class Child : Parent 
{ 
} 

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

bambino è mappato come uniti-sottoclasse di Parent. Childen è mappato come un sacchetto Many-a-One. Alla borsa è applicato un filtro chiamato SoftDeletableFilter. La mappatura del filtro assomiglia:

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

Questo problema è che quando viene caricato Other.Children il filtro viene applicato alla tabella figlio e non tabella padre. C'è un modo per dire a NHibernate di applicare il filtro alla classe genitore?

Edit: Ecco la mappatura genitore:

<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

incontrato lo stesso problema di oggi. Hai mai trovato una soluzione? – Joel

risposta

0

è necessario aggiungere il filtro alla classe padre:

<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

Questo non risolve il problema. Se interrogo la classe Parent, gli elementi eliminati verranno filtrati, ma se aggiungo un sacchetto alla classe figlia non verranno filtrati. – Joel

+0

Ho aggiunto il filtro nella sottoclasse unita, puoi verificare se questo funziona per te? La documentazione di Nhibernate fornisce un esempio simile per gli insiemi. – Peter

+0

'filter-def' non è un elemento figlio valido della sottoclasse unita. – Joel

1

finalmente trovato una risposta a questo. Forse non è l'approccio amichevole più prestazioni, ma è possibile riscrivere la tua condizione di filtro come sottoquery:

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

Grazie alla CSharper sopra at the usergroup per il suggerimento