Que mas Danilo,

Verificando en tu mapeo te sugiero lo siguiente:

   - SI estas usanando una relacion inversa *inverse=true* debes tener una
   relacion bidireccional donde el hijo referencie a su padre por medio de una
   relacion <many-to-one>.
   - Si no necesitas esta relacion bidireccional entonces puedes
   tranquilamente quitar el *inverse=true*
   - Remueve la propiedad *MenIdPadre*.
   - A menos que tengas porblemas de inconsistencia de datos o sea una Base
   de Datos legacy utiliza not-found="ignore" sino remuevelo.
   - En tu consulta te estas trayendo unicamente los padres que esta activos
   pero al recorrer sus hijos vas a tener TODOs los hijos.  Sin embargo al
   quitar la restriccion de que la propiedad *MenIdPadre* sea null vas a
   obtener TODOS los menus activos independiente de la jerarquía.
   - Te sugiero que modifiques tu consulta a algo como "select m from Menu m
   left join m.MenuPadre p where m.Estado = 'Activo' and (p is null or p.Estado
   = 'Activo')" .  De esta manera te vas a traer NO solo todos los que esten
   activos sino que ademas aquellos donde sus padres tambien esten activos.
   - Por ultimo, en caso de que no estes generando el esquema de la BD desde
   NH entonces utiliza un validador de esquema.

Cuentanos como te va.

Saludos
Nestor Rodriguez


2010/10/1 Danilo Rueda <[email protected]>

> Cordiales Saludos,
>
> Soy nuevo en Nhibernate y puede ser que lo que pregunte sea más
> sencillo de lo que creo.
> Tengo una tabla recursiva para almacenar unos menus que pueden tener
> hijos y los hijos su vez más hijos.
> Cuando traigo los menus padres quiero que traiga los hijos y asi
> sucvesivamente. (Esto lo hago bien y me funciona) pero cuando intento
> colocar filtros o criterios solamente me afectan a los menus padres y
> no afecta los BAG o conjuntos de hijos.
> Eh intentado crear alias para filtrar los hijos pero no obtengo los
> resultados que quiero.
> Si alguien me puede ayudar, le agradecería mucho. Dejo el códido, el
> mapeo y la clase.
>
> Para mi es importante que las restricciones se efectuen como en
> cascada (si se puede aplicar)  porque solamente debería tyrae los
> menus padres Activos y sus hijos Activos, pero lo que realmente hace
> es traer los padres activos pero los hijos activos e inactivos y esto
> aplica para otros criterios.
>
> Gracias
>
> Este es mi Codigo:
>
> Dim listaMenu As IList(Of SegMenu)
> Dim miCriterio As NHibernate.ICriteria
> miCriterio = SesionDb.Session.CreateCriteria(Of SegMenu)()
>
> With miCriterio
>  .Add(Restrictions.Eq("Estado", "Activo"))
>  .Add(Restrictions.Eq("TipoMenu", "Horizontal"))
>  .Add(Restrictions.IsNull("MenIdPadre"))
>  .AddOrder(Order.Asc("Orden"))
> End With
>
> listaMenu = miCriterio.List(Of SegMenu)()
>
> Mi Mapeo:
> <?xml version="1.0" encoding="utf-8" ?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> assembly="WcfSuifp" namespace="WcfSuifp.Suifp.Persistencia.Seguridad">
>  <class name="SegMenu" lazy="false">
>    <id name="MenId" column="MenId" type ="decimal" unsaved-value="0">
>      <generator class="identity"/>
>    </id>
>    <property name="MenIdPadre" type="decimal" not-null="false" />
>        ...
>    <bag name="SubMenu" table="SegMenu" inverse="true" lazy ="false" >
>      <key column="MenIdPadre" />
>      <one-to-many class="SegMenu" not-found="ignore" />
>    </bag>
>
>  </class>
> </hibernate-mapping>
> y mi clase
> Namespace Suifp.Persistencia.Seguridad
>    <DataContract()> _
>    Public Class SegMenu
> #Region "Declaraciones"
>
>        Private menIdValor As Nullable(Of Decimal)
>        Private menIdPadreValor As Nullable(Of Decimal)
>        ...
>        Private subMenuValor As IList(Of SegMenu)
>
> #End Region
> #Region "Propiedades"
>        <DataMember()> _
>        Public Property MenId() As Nullable(Of Decimal)
>            Get
>                Return menIdValor
>            End Get
>            Set(ByVal value As Nullable(Of Decimal))
>                menIdValor = value
>            End Set
>        End Property
>        <DataMember()> _
>        Public Property MenIdPadre() As Nullable(Of Decimal)
>            Get
>                Return menIdPadreValor
>            End Get
>            Set(ByVal value As Nullable(Of Decimal))
>                menIdPadreValor = value
>            End Set
>        End Property
>        '''
>        <DataMember()> _
>        Public Property SubMenu() As IList(Of SegMenu)
>            Get
>                Return subMenuValor
>            End Get
>            Set(ByVal value As IList(Of SegMenu))
>                subMenuValor = value
>            End Set
>        End Property
>
> #End Region
>
>
> Nuevamente Gracias
>
> D.R.
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a