2017-07-10 79 views
0

考慮下面的映射:NHibernate的不灌裝設置,但SQL是正確的

<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(); 

返回的SQL語句,似乎這兩個屬性是正確的,但是,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'; 

如果我直接執行這個SQL,它不是空的。

+0

您顯示的電話不會調用任何內容。它只會聲明兩個期貨,而不會將它們存儲在某些變量中以供以後執行。你如何觸發他們的執行? –

回答

0

最後,這個問題是由於在某些記錄中主鍵爲空的一個字段造成的。

NHibernate不支持這個,但它至少應該給出一個提示。