2012-09-19 122 views
0

我有一个问题,因为一些未知的原因,NHibernate生成错误的SQL。Nhibernate表每个子类与鉴别器

以下是我的映射文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="BAM.PMT.Domain" 
        namespace="BAM.PMT.Domain.Core.Cos"> 

    <class name="SiteServiceEntity" table="SiteServiceEntity" schema="core_cos" dynamic-update="true" abstract="true" discriminator-value="-1"> 
     <id name="Id" access="field.camelcase-underscore"> 
      <generator class="guid.comb" /> 
     </id> 

     <discriminator column="Type" type="short" /> 

     <component name="Name" access="field.camelcase-underscore"> 
      <property name="Nl" column="NameNl" /> 
      <property name="Fr" column="NameFr" /> 
      <property name="En" column="NameEn" /> 
      <property name="De" column="NameDe" /> 
     </component> 

     <property name="Code" access="field.camelcase-underscore" /> 

     <subclass name="BAM.PMT.Domain.Core.Cos.SiteServiceCategory" dynamic-update="true" discriminator-value="0"> 
      <set name="SiteServiceGroups" table="SiteServiceGroup" schema="core_cos" cascade="none" inverse="true" access="field.camelcase-underscore"> 
       <key column="SiteServiceCategoryId" /> 
       <one-to-many class="SiteServiceGroup" /> 
      </set> 
      <join table="SiteServiceCategory" schema="core_cos"> 
       <key column="Id"/> 

       <many-to-one name="Site" class="BAM.PMT.Domain.Core.Sites.Site" column="SiteId" cascade="none" access="field.camelcase-underscore" /> 
      </join> 
     </subclass> 

     <subclass name="BAM.PMT.Domain.Core.Cos.SiteServiceGroup" dynamic-update="true" discriminator-value="1"> 
      <set name="SiteServices" table="SiteService" schema="core_cos" cascade="none" inverse="true" access="field.camelcase-underscore"> 
       <key column="SiteServiceGroupId" /> 
       <one-to-many class="SiteService" /> 
      </set> 
      <join table="SiteServiceGroup" schema="core_cos"> 
       <key column="Id"/> 

       <many-to-one name="SiteServiceCategory" class="SiteServiceCategory" column="SiteServiceCategoryId" cascade="none" access="field.camelcase-underscore" /> 

      </join> 
     </subclass> 

     <subclass name="BAM.PMT.Domain.Core.Cos.SiteService" dynamic-update="true" discriminator-value="2"> 
      <set name="Subcontractors" table="SiteServiceSubcontractor" schema="core_cos" cascade="save-update" access="field.camelcase-underscore"> 
       <key column="SiteServiceId" /> 
       <many-to-many class="BAM.PMT.Domain.Core.Sites.Subcontractor" column="SubcontractorId" /> 
      </set> 

      <set name="SiteKpis" table="SiteKPI" schema="core_cos" cascade="none" inverse="true" access="field.camelcase-underscore"> 
       <key column="SiteServiceId" /> 
       <one-to-many class="SiteKpi" /> 
      </set> 

      <set name="SiteCauses" table="SiteCause" schema="helpdesk" cascade="none" inverse="true" access="field.camelcase-underscore"> 
       <key column="SiteServiceId" /> 
       <one-to-many class="BAM.PMT.Domain.Helpdesk.SiteCause" /> 
      </set> 
      <join table="SiteService" schema="core_cos"> 
       <key column="Id"/> 

       <many-to-one name="SiteServiceGroup" class="SiteServiceGroup" column="SiteServiceGroupId" cascade="none" access="field.camelcase-underscore" /> 
       <many-to-one name="Service" class="Service" column="ServiceId" cascade="none" access="field.camelcase-underscore" /> 
       <many-to-one name="SiteResponsible" class="BAM.PMT.Domain.Core.Security.User" column="SiteResponsibleId" cascade="none" access="field.camelcase-underscore" /> 
       <many-to-one name="BamResponsible" class="BAM.PMT.Domain.Core.Security.User" column="BamResponsibleId" cascade="none" access="field.camelcase-underscore" /> 
       <many-to-one name="SubcontractorResponsible" class="BAM.PMT.Domain.Core.Security.User" column="SubContractorResponsibleId" cascade="none" access="field.camelcase-underscore" /> 

      </join> 
     </subclass> 
    </class> 

</hibernate-mapping> 

当我使用下面的查询完整的树结构:生成

var query = QueryOver.Of<SiteServiceCategory>(); 
      query.OrderBy(s => s.Code).Asc() 
       .ThenBy(s => s.Id).Asc() 
       .Left.JoinQueryOver(sc => sc.SiteServiceGroups) 
       .OrderBy(sg => sg.Code).Asc() 
       .ThenBy(sg => sg.Id).Asc() 
       .Left.JoinQueryOver(sg => sg.SiteServices) 
       .OrderBy(s => s.Code).Asc() 
       .ThenBy(s => s.Id).Asc() 
       .Left.JoinQueryOver(s => s.Service); 

      query 
       .Where(sc => sc.Site.Id == siteId) 
       .TransformUsing(Transformers.DistinctRootEntity); 



      return query; 

下面的SQL:

SELECT this_.id         AS Id105_3_, 
     this_.namenl        AS NameNl105_3_, 
     this_.namefr        AS NameFr105_3_, 
     this_.nameen        AS NameEn105_3_, 
     this_.namede        AS NameDe105_3_, 
     this_.code        AS Code105_3_, 
     this_1_.siteid       AS SiteId106_3_, 
     siteservic1_1_.siteservicecategoryid  AS SiteServ2_5_, 
     siteservic1_.id       AS Id5_, 
     siteservic1_.id       AS Id105_0_, 
     siteservic1_.namenl      AS NameNl105_0_, 
     siteservic1_.namefr      AS NameFr105_0_, 
     siteservic1_.nameen      AS NameEn105_0_, 
     siteservic1_.namede      AS NameDe105_0_, 
     siteservic1_.code       AS Code105_0_, 
     siteservic1_1_.siteservicecategoryid  AS SiteServ2_107_0_, 
     siteservic2_1_.siteservicegroupid   AS SiteServ2_6_, 
     siteservic2_.id       AS Id6_, 
     siteservic2_.id       AS Id105_1_, 
     siteservic2_.namenl      AS NameNl105_1_, 
     siteservic2_.namefr      AS NameFr105_1_, 
     siteservic2_.nameen      AS NameEn105_1_, 
     siteservic2_.namede      AS NameDe105_1_, 
     siteservic2_.code       AS Code105_1_, 
     siteservic2_1_.siteservicegroupid   AS SiteServ2_109_1_, 
     siteservic2_1_.serviceid     AS ServiceId109_1_, 
     siteservic2_1_.siteresponsibleid   AS SiteResp4_109_1_, 
     siteservic2_1_.bamresponsibleid   AS BamRespo5_109_1_, 
     siteservic2_1_.subcontractorresponsibleid AS SubContr6_109_1_, 
     service3_.id        AS Id16_2_, 
     service3_.code       AS Code16_2_, 
     service3_.namenl       AS NameNl16_2_, 
     service3_.namefr       AS NameFr16_2_, 
     service3_.nameen       AS NameEn16_2_, 
     service3_.namede       AS NameDe16_2_, 
     service3_.isactive      AS IsActive16_2_, 
     service3_.servicegroupid     AS ServiceG8_16_2_ 
FROM core_cos.siteserviceentity this_ 
     INNER JOIN core_cos.siteservicecategory this_1_ 
       ON this_.id = this_1_.id 
     LEFT OUTER JOIN core_cos.siteserviceentity siteservic1_ 
        ON this_.id = siteservic1_.siteservicecategoryid 
     LEFT OUTER JOIN core_cos.siteservicegroup siteservic1_1_ 
        ON siteservic1_.id = siteservic1_1_.id 
     LEFT OUTER JOIN core_cos.siteserviceentity siteservic2_ 
        ON siteservic1_.id = siteservic2_.siteservicegroupid 
     LEFT OUTER JOIN core_cos.siteservice siteservic2_1_ 
        ON siteservic2_.id = siteservic2_1_.id 
     LEFT OUTER JOIN core_cos.service service3_ 
        ON siteservic2_1_.serviceid = service3_.id 
WHERE this_.type = 0 
     AND this_1_.siteid = @p0 
ORDER BY this_.code ASC, 
      this_.id ASC, 
      siteservic1_.code ASC, 
      siteservic1_.id ASC, 
      siteservic2_.code ASC, 
      siteservic2_.id ASC 

的问题是在left outer joinsiteservic1_.siteservicecategoryidsiteservic2_.siteservicegroupid不在这些表上。这些是目前在以下内容:siteservic1_1_.siteservicecategoryid - siteservic2_1_.siteservicegroupid

任何人有任何想法是怎么回事,如果需要可以提供额外的信息。

在此先感谢!

回答

-3

Lazy loading inheritance

Mapping inheritance

这两个解决我的问题。

+5

尽管这些链接可能会回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – Joel

相关问题