0

我有4个表,定义如下:功能NHibernate - 如何映射到具有参考查找表表

Projects: 
    Project_Id 
    Project_Name 

Vendors: 
    Vendor_Id 
    Vendor_Name 

Project_Vendors: 
    Project_Vendor_Id 
    Project_Id 
    Vendor_Id 

Project_Vendor_Payments: 
    Payment_Id 
    Project_Vendor_Id 
    Payment_Amount 

我不知道从哪里开始,甚至定义我的班级,功能NHibernate工作更不用说定义我的映射。

一个项目可以有许多供应商与之关联,并且供应商可以为每个项目接收许多付款。

有关我如何实现此目标的任何想法?

回答

4

我通过不引用我的查找表来解决这个问题,而是直接引用实体的外键列。

这里是我的表结构:

Projects: 
    Project_Id 
    Project_Name 

Vendors: 
    Vendor_Id 
    Vendor_Name 

Project_Vendors: 
    Project_Vendor_Id 
    Project_Id 
    Vendor_Id 

Project_Vendor_Payments: 
    Payment_Id 
    Project_Id 
    Vendor_Id 
    Payment_Amount 

我的类被定义为:

public class Project 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Vendor> Vendors { get; set; } 
    public virtual IList<VendorPayment> VendorPayments { get; set; } 
} 

public class Vendor 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

public class VendorPayment 
{ 
    public virtual int Id { get; set; } 
    public virtual Vendor Vendor { get; set; } 
    public virtual float Amount { get; set; } 
} 

我的映射:

public ProjectMappings : ClassMap<Project> 
{ 
    public ProjectMappings() 
    { 
     Table("Projects"); 
     Id(x => x.Id).Column("Project_Id"); 
     HasManyToMany(x => x.Vendors).Table("Project_Vendors") 
      .ParentKeyColumn("Project_Id") 
      .ChildKeyColumn("Vendor_Id") 
      .Cascade.AllDeleteOrphan(); 
     HasMany(x => x.VendorPayments).Table("Project_Vendor_Payments") 
      .KeyColumn("Project_Id") 
      .Cascade.AllDeleteOrphan(); 
     Map(x => x.Name).Column("Project_Name") 
    } 
} 

public class VendorMappings : ClassMap<Vendor> 
{ 
    public VendorMappings() 
    { 
     Table("Vendors"); 
     Id(x => x.Id).Column("Vendor_Id"); 
     Map(x => x.Name).Column("Vendor_Name"); 
    } 
} 

public class VendorPaymentMappings : ClassMap<VendorPayment> 
{ 
    public VendorPaymentMappings() 
    { 
     Table("Project_Vendor_Payments"); 
     Id(x => x.Id).Column("Payment_Id"); 
     References(x => x.Vendor).Column("Vendor_Id"); 
     Map(x => x.Amount).Column("Payment_Amount"); 
    } 
} 

这不是一个确切的答案,我问题,而只是解决问题的方法。仍在寻找如何完成问题的内容。