代码之家  ›  专栏  ›  技术社区  ›  Pinx0

NHibernate不是填充集,但SQL是正确的

  •  0
  • Pinx0  · 技术社区  · 9 年前

    考虑以下映射:

    <class name="Articulo" table="Articulos">
     <id name="Id" column="IdArticulo"/>
     <set name="CodigosProveedor" inverse="true" fetch="select">
      <key>
        <column name="IdArticulo"/>
      </key>
      <one-to-many class="ArticuloProveedor"/>
     </set>
     <set name="PuntosPedido" inverse="true" fetch="select">
      <key column="IdArticulo" foreign-key="IdArticulo"/>
      <one-to-many class="PuntoPedido"/>
     </set>
     ...
    </class>
    
    <class name="PuntoPedido" table="PersISAVAL_SPCO_Previsiones_PuntosPedidoMes">
     <composite-id>
      <key-many-to-one name="Articulo" column="IdArticulo"/>
      <key-many-to-one name="Color" column="IdColor"/>
      <key-many-to-one name="Proveedor" column="IdProveedor"/>
     </composite-id>
     <property name="Valor" column="PuntoPedido"/>
    </class>
    
    <class name="ArticuloProveedor" table="Prov_Articulos">
     <composite-id>
      <key-property name="IdArticulo" column="IdArticulo"/>
      <key-property name="IdProveedor" column="IdProveedor"/>
     </composite-id>
     <property name="LeadTimeForzado" column="PlazoAprovisionamiento"/>
     <property name="IdEstadoHomologacion" column="Estado_Homologacion"/>
     <many-to-one name="Articulo" column="IdArticulo"/>
     <many-to-one name="Proveedor" column="IdProveedor"/>
    </class>
    

    然后通话:

             _session.QueryOver<Articulo>()
                .Where(e => e.ProveedorPreferencial == p)
                .Fetch(a => a.CodigosProveedor).Eager
                .Future();
             _session.QueryOver<Articulo>()
               .Where(a => a.ProveedorPreferencial == p)
               .Fetch(a => a.PuntosPedido).Eager
               .Future();
    

    CodigosProveedor PuntosPedido 保持为空。为什么会这样?

    SQL语句,它们看起来似乎是一样的:

    SELECT this_.IdArticulo                           as IdArti1_4_1_,
       this_.Descrip                              as Descri2_4_1_,
       this_.IdProveedorPreferencial              as IdPro11_4_1_,
       puntospedi2_.IdArticulo                    as IdArt1_53_3_,
       puntospedi2_.IdColor                       as IdCol2_53_3_,
       puntospedi2_.IdProveedor                   as IdPro3_53_3_,
       puntospedi2_.IdArticulo                    as IdArt1_53_0_,
       puntospedi2_.IdColor                       as IdCol2_53_0_,
       puntospedi2_.IdProveedor                   as IdPro3_53_0_,
       puntospedi2_.PuntoPedido                   as Punto4_53_0_
      FROM   Articulos this_
       inner join Conf_Articulos this_1_
         on this_.IdArticulo = this_1_.IdArticulo
       left outer join PersISAVAL_SPCO_Previsiones_PuntosPedidoMes puntospedi2_
         on this_.IdArticulo = puntospedi2_.IdArticulo
      WHERE  this_.IdProveedorPreferencial = '01816';
    
    SELECT this_.IdArticulo                           as IdArti1_4_1_,
       this_.Descrip                              as Descri2_4_1_,
       this_.IdProveedorPreferencial              as IdPro11_4_1_,
       codigospro2_.IdArticulo                    as IdArt1_51_3_,
       codigospro2_.IdProveedor                   as IdPro2_51_3_,
       codigospro2_.IdArticulo                    as IdArt1_51_0_,
       codigospro2_.IdProveedor                   as IdPro2_51_0_,
       codigospro2_.PlazoAprovisionamiento        as Plazo3_51_0_,
       codigospro2_.Estado_Homologacion           as Estad4_51_0_
      FROM   Articulos this_
       inner join Conf_Articulos this_1_
         on this_.IdArticulo = this_1_.IdArticulo
       left outer join Prov_Articulos codigospro2_
         on this_.IdArticulo = codigospro2_.IdArticulo
      WHERE  this_.IdProveedorPreferencial = '01816';
    

    1 回复  |  直到 9 年前
        1
  •  0
  •   Pinx0    9 年前

    最后,这个问题是由于主键的一个字段在某些记录中为空而引起的。