C# 在正确的列上强制连接fluent nhibernate?

C# 在正确的列上强制连接fluent nhibernate?,c#,nhibernate,fluent-nhibernate,db2-400,C#,Nhibernate,Fluent Nhibernate,Db2 400,使用这些实体时: [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

使用这些实体时:

[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; }
}
[AS400Entity]
公共类AuthItemEntity
{
公共虚拟十进制Upc{get;set;}
公共虚拟字符串VendorItemCode{get;set;}
公共虚拟整数供应商{get;set;}
公共虚拟int ProductVendorNumber{get;set;}
公共虚拟字符串描述{get;set;}
公共虚拟日期时间AddDate{get;set;}
公共虚拟日期时间VendorDiscontinueDate{get;set;}
公共虚拟VendorMasterEntity VendorMaster{get;set;}
}
[AS400实体]
公共类VendorMasterEntity
{
公共虚拟公司编号{get;set;}
公共虚拟整数供应商{get;set;}
公共虚拟CompNamesEntity CompNames{get;set;}
公共虚拟IList AuthItems{get;set;}
}
[AS400实体]
公共类CompNamesEntity
{
公共虚拟公司编号{get;set;}
公共虚拟字符串CompanyName{get;set;}
公共虚拟IList 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();
    }
}
公共类AuthItemEntityMapping:ClassMap
{
公共AuthItemEntityMapping()
{
表(“项目”);
Id(实体=>entity.Vendor,“项目供应商”);
映射(entity=>entity.ProductVendorNumber,“产品\供应商”);
Map(model=>model.Upc,“ITEM_Upc”);
映射(model=>model.VendorItemCode,“供应商项目代码”);
映射(model=>model.Vendor,“ITEM_Vendor”);
映射(model=>model.Description,“ITEM_Description”);
映射(model=>model.AddDate,“ADD_DATE”).CustomType(“DATE”);
映射(model=>model.VendorDiscontinueDate,“VENDOR\u continuedate”).CustomType(“DATE”);
HasOne(entity=>entity.VendorMaster).Fetch.Join().ForeignKey(“ITEM_VENDOR”);
}
}
公共类VendorMasterEntityMap:ClassMap
{
public VendorMasterEntityMap()
{
表(“卖方”);
Id(实体=>entity.Vendor,“项目供应商”);
Id(entity=>entity.CompanyNumber,“公司编号”);
HasOne(entity=>entity.CompNames).Fetch.Join().ForeignKey(“公司编号”);
HasMany(entity=>entity.AuthItems).Cascade.All();
}
}
公共类CompNamesEntityMap:ClassMap
{
public CompNamesEntityMap()
{
表(“公司名称”);
Id(entity=>entity.CompanyNumber,“公司编号”);
映射(实体=>entity.CompanyName,“公司名称”);
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 = ?
选择此项目供应商为项目1\u 3\u 2\u,此产品供应商为产品2\u 3\u 2\u,此项目UPC为项目3\u 3\u 2\u,此供应商项目代码为供应商4\u 3\u 2\u,此项目描述为项目5\u 3\u 2\u,此添加日期为ADD6\u 3\u 2\u,此终止日期为供应商7\u 3\u 2\u,公司编号为0,公司名称3.公司编号为公司1.公司名称3.公司名称为公司2.公司名称4.公司名称
从AUTHITEM this\u

左外连接VENDMAST vendormast2在这个项目上VENDOR=vendormast2公司编号截至2014年12月,您仍然无法解决这个问题:

这是有意义的,因为它是一个ORM,我们试图在没有正确执行关系的数据库上使用它(缺少键,但数据的行为是这样的)

这个问题迫使我的公司完全放弃了NHibernate

我希望这个答案能让其他人避免犯同样的错误和浪费时间