0

假設我已經4個表定義爲引用一個ID映射表如下:功能NHibernate - 其中從查找表

項目:[PROJECT_ID,PROJECT_NAME]

賣方:[VENDOR_ID,VENDOR_NAME ]

Project_Vendors:[Project_Vendor_Id,VENDOR_ID,PROJECT_ID]

付款:[Payment_Id,Project_Vendor_Id,支付金額]

的關係應該如下:

  • 一個項目可以有關聯的許多廠商
  • 供應商可以屬於很多項目
  • 許多可以向項目的許多供應商付款(因此支付的唯一支付是項目和供應商)

我可以使用ProjectVendors查找表容易映射項目和供應商對象以及它們之間的關係如下:

public class ProjectMapping : ClassMap<Project> 
{ 
    public ProjectMapping() 
    { 
     Table("Projects"); 
     Id(x => x.Id).Column("Project_Id").GeneratedBy.TriggerIdentity(); 
     HasManyToMany(x => x.Vendors).Table("Project_Vendors") 
      .ParentKeyColumn("Project_Id") 
      .ChildKeyColumn("Vendor_Id") 
      .Cascade.AllDeleteOrphan(); 
    } 
} 

我的問題是,如果我的類定義如下:

public class Payment 
{ 
    public virtual int? Id { get; set; } 
    public virtual Project Project { get; set; } 
    public virtual Vendor Vendor { get; set; } 
    public virtual double Amount { get; set; } 
} 

public class Project 
{ 
    public virtual int? Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual List<Vendor> Vendors { get; set; } 
    public virtual List<Payment> VendorPayments { get; set; } 
} 

我怎樣才能使用查找表Project_Vendors映射我的項目和付款對象?

回答

1

不直接可能沒有映射Project_Vendors表,因爲NHibernate必須知道引用ID來自哪裏。你可能會僞造它,但我會反對它。

class ProjectVendorPair 
{ 
    public virtual int Id { get; set; } 
    public virtual Project Project { get; set; } 
    public virtual Vendor Vendor { get; set; } 
} 

// in PaymentMap 
References(x => x.Owner, "Project_Vendor_Id"); 

,或者您更改數據庫結構:

  • 擺脫列Project_Vendor_Id
  • 有PROJECT_ID和VENDOR_ID列在付款表
+0

是的,我有種想通了這。我不介意改變數據庫結構,只不過它會消除數據的完整性並且還會創建少量重複數據。您認爲這種方法在企業級軟件中可以接受嗎?您的數據完整性更依賴於應用程序級別而不是數據庫級別? –

+0

當在鏈接表中定義對「Project_id」和「Vendor_id」的唯一約束並將「Payment.Project_id/Vendor_id」中的外鍵約束定義到鏈接表時,dataintegrity仍然是安全的。它可能更有效率,因爲您在付款時無需前往數據庫以獲取'Project_Vendor_Id' – Firo