2014-12-19 1 views
1

사용하여 이러한 개체 :올바른 열에 유창한 nhibernate 조인을 강제 하시겠습니까?

[AS400Entity] 
public class AuthItemEntity 
{ 
    public virtual decimal Upc { get; set; } 
    public virtual string VendorItemCode { get; set; } 
    public virtual int Vendor { get; set; } 
    public virtual int ProductVendorNumber { get; set; } 
    public virtual string Description { get; set; } 
    public virtual DateTime AddDate { get; set; } 
    public virtual DateTime VendorDiscontinueDate { get; set; } 

    public virtual VendorMasterEntity VendorMaster { get; set; } 
} 

[AS400Entity] 
public class VendorMasterEntity 
{ 
    public virtual int CompanyNumber { get; set; } 
    public virtual int Vendor { get; set; } 
    public virtual CompNamesEntity CompNames { get; set; } 
    public virtual IList<AuthItemEntity> AuthItems { get; set; } 
} 

[AS400Entity] 
public class CompNamesEntity 
{ 
    public virtual int CompanyNumber { get; set; } 
    public virtual string CompanyName { get; set; } 
    public virtual IList<VendorMasterEntity> VendorMasts { get; set; } 
} 

그리고이 매핑은 :

SELECT this_.ITEM_VENDOR as ITEM1_3_2_, this_.PRODUCT_VENDOR as PRODUCT2_3_2_, this_.ITEM_UPC as ITEM3_3_2_, this_.VENDOR_ITEM_CODE as VENDOR4_3_2_, this_.ITEM_DESCRIPTION as ITEM5_3_2_, this_.ADD_DATE as ADD6_3_2_, this_.VENDOR_DISCONTINUE_DATE as VENDOR7_3_2_, vendormast2_.COMPANY_NUMBER as COMPANY1_5_0_, compnamese3_.COMPANY_NUMBER as COMPANY1_4_1_, compnamese3_.COMPANY_NAME as COMPANY2_4_1_ 
FROM AUTHITEM this_ 
    left outer join VENDMAST vendormast2_ on this_.ITEM_VENDOR=vendormast2_.COMPANY_NUMBER <-- should be item_vendor 
    left outer join COMPNAMES compnamese3_ on vendormast2_.COMPANY_NUMBER=compnamese3_.COMPANY_NUMBER WHERE this_.ITEM_UPC = ? and this_.VENDOR_DISCONTINUE_DATE = ? 

단지 속성 참조 멀리 잘되는 것입니다 :

public class AuthItemEntityMapping : ClassMap<AuthItemEntity> 
{ 
    public AuthItemEntityMapping() 
    { 
     Table("AUTHITEM"); 
     Id(entity => entity.Vendor, "ITEM_VENDOR"); 
     Map(entity => entity.ProductVendorNumber, "PRODUCT_VENDOR"); 
     Map(model => model.Upc, "ITEM_UPC"); 
     Map(model => model.VendorItemCode, "VENDOR_ITEM_CODE"); 
     Map(model => model.Vendor, "ITEM_VENDOR"); 
     Map(model => model.Description, "ITEM_DESCRIPTION"); 
     Map(model => model.AddDate, "ADD_DATE").CustomType("Date"); 
     Map(model => model.VendorDiscontinueDate, "VENDOR_DISCONTINUE_DATE").CustomType("Date"); 

     HasOne(entity => entity.VendorMaster).Fetch.Join().ForeignKey("ITEM_VENDOR"); 
    } 
} 

public class VendorMasterEntityMap : ClassMap<VendorMasterEntity> 
{ 
    public VendorMasterEntityMap() 
    { 
     Table("VENDMAST"); 

     Id(entity => entity.Vendor, "ITEM_VENDOR"); 
     Id(entity => entity.CompanyNumber, "COMPANY_NUMBER"); 

     HasOne(entity => entity.CompNames).Fetch.Join().ForeignKey("COMPANY_NUMBER"); 

     HasMany(entity => entity.AuthItems).Cascade.All(); 
    } 
} 

public class CompNamesEntityMap : ClassMap<CompNamesEntity> 
{ 
    public CompNamesEntityMap() 
    { 
     Table("COMPNAMES"); 
     Id(entity => entity.CompanyNumber, "COMPANY_NUMBER"); 
     Map(entity => entity.CompanyName, "COMPANY_NAME"); 

     HasMany(entity => entity.VendorMasts).Cascade.All(); 
    } 
} 

나는이 SQL을 얻는다.

참고 :이 게으른 로딩을 사용할 수 없기 때문에 어디서나 HasOne()을 사용하고 있습니다. 쿼리 할 때로드해야합니다.

https://github.com/jagregory/fluent-nhibernate/issues/272

그것은 그것이 ORM의 때문에 의미 을하고 우리는 (적절하게 적용 관계없이 데이터베이스에하고있었습니다 :

답변

0

2014 년 12 월, 당신은 여전히이 문제를 해결할 수 없습니다 키가 누락되었지만 데이터가이 방식으로 작동 함).

이 문제로 인해 회사에서 NHibernate를 완전히 삭제해야했습니다.

이 답변으로 다른 사람이 실수를하거나 시간을 낭비하지 않기를 바랍니다.