[英]Force fluent-nhibernate join on correct column?
使用這些實體時:
[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; }
}
和這個映射:
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:
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 = ?
這只是正確的屬性參考。
請注意:我無處不在使用HasOne(),因為我無法進行這種延遲加載,它必須在查詢時加載。
截至2014年12月,您仍然無法解決此問題:
https://github.com/jagregory/fluent-nhibernate/issues/272
這是有道理的, 因為它是一個ORM,並且我們試圖在沒有適當強制關系的情況下在數據庫上使用它(丟失了鍵,但是數據的行為方式如此)。
這個問題迫使我的公司完全放棄了NHibernate。
我希望這個答案可以避免其他人犯同樣的錯誤並浪費他們的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.