2015-12-09 23 views
2

哪種模型將多個一對一關係建模到同一個表(sqlite-net-extensions)的最佳方法是什麼?我正在尋找這樣的解決方案:將多個一對一關係映射到同一個表

Class WayBill 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    [ForeignKey(typeof(Organization))] 
    public int ConsignerId {get; set;} 

    [OneToOne] 
    public Organization Consigner {get; set;} 

    [ForeignKey(typeof(Organization))] 
    public int ConsigneeId {get; set;} 

    [OneToOne] 
    public Organization Consignee {get; set;} 
} 


Class Organization 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    public string Name {get; set;} 
}  

很明顯,上述不起作用。

我也考慮過其他的選擇太多:

  1. 創建表(WayBillOrganization)捕獲組織的作用: 運單 - 將要求>組織

  2. - >> WayBillOrganization將OneToMany屬性反轉到組織中。

  3. 手動處理事物(即僅在WayBill類中存儲主鍵並單獨加載組織)。

選項2.是我想要避免的。組織與許多其他類別(不在我的例子中)相關,即使在運單的情況下,我還沒有將其他幾個關係(例如運輸公司,貨物付款方,貨運代理等)列入其中。此外,我寧願只在需要導航時使用反轉屬性(例如,我不使用組織來查找運單,因此反轉屬性只是額外的負擔。)

選項3.不是那也很吸引人。

所以選項1似乎是要走的路。但在去那裏之前,我想知道我的例子中的完美世界解決方案是否確實不可能。

所以,我的問題是:有沒有一種方法來模擬多個單向 OneToOne關係沒有顯式聲明的逆性質?

回答

3

您的用例在SQLite-Net Extensions中受支持。你只需要明確指定外鍵的關係屬性,因爲預期自動發現可能無法正常工作:

class WayBill 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    public int ConsignerId {get; set;} 

    [OneToOne("ConsignerId")] 
    public Organization Consigner {get; set;} 

    public int ConsigneeId {get; set;} 

    [OneToOne("ConsigneeId")] 
    public Organization Consignee {get; set;} 
} 


class Organization 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    public string Name {get; set;} 
} 

反向關係同一類的也都支持,但必須在兩端也顯式聲明:

class WayBill 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    public int ConsignerId {get; set;} 

    [OneToOne(foreignKey: "ConsignerId", inverseProperty: "ConsignerInverse")] 
    public Organization Consigner {get; set;} 

    public int ConsigneeId {get; set;} 

    [OneToOne(foreignKey: "ConsigneeId", inverseProperty: "ConsigneeInverse")] 
    public Organization Consignee {get; set;} 
} 


class Organization 
{ 
    [PrimaryKey, AutoIncrement] 
    public int Id {get; set;} 

    public string Name {get; set;} 

    [OneToOne(foreignKey: "ConsigneeId", inverseProperty: "Consignee")] 
    public WayBill ConsigneeInverse { get; set; } 

    [OneToOne(foreignKey: "ConsignerId", inverseProperty: "Consigner")] 
    public WayBill ConsignerInverse { get; set; } 
} 
+0

完美!謝謝** redent84 **。你爲我節省了幾個小時的工作。 – user2261054

+0

很高興我能幫到你。如果它解決了您的問題,請考慮將upvoting/marking標記爲已接受,以便其他人可以找到它。 – redent84

+0

感謝您輸入(Y)。 順便說一句,最好是使用連接表,而不是直接在上面的場景中映射。 – harshlal028

相關問題