2009-11-29 70 views
2

有沒有什麼辦法可以在NHibernate中建立對稱的自連接關係映射?假設我們有兩個表:NHibernate自加入多對多的對稱關係(人朋友問題)

Users 
    id 

Relations 
    id 
    user1 
    user2 
    relation_type 

用戶和關係類應該是這樣的:

class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual ISet<Relation> Relations { get; set; } 
} 

class Relation 
{ 
    public virtual int Id { get; set; } 
    public virtual User User1 { get; set; } 
    public virtual User User2 { get; set; } 
    // Let's leave the RealationType as string for the sake of brevity 
    public virtual string RelationType { get; set; } 
} 

我不想在relations表有兩行相同的關係。但是關係必須是對稱的,這意味着如果兩個用戶A和B之間存在關係,則用戶A的集合必須包含與用戶B的關係,並且用戶B的關係必須包含與A的關係。

這聽起來像是一個挑戰。但是,有人能解決這個問題嗎?請,如果可以的話,發佈xml映射。我沒有使用Fluent。

回答

0

您可以使用Key-Many-To-One映射並從關係實體中刪除Id字段。此外,您最好對不同的關係類型使用繼承。

+0

好了,這樣的話,對於關係的映射將不會停... <類名=「關係」表=「關係」> <複合-ID> <鍵多對多-one name =「User1」class =「User」/> 我該如何映射用戶類?由於id可以在'user1'或'user2'列中。 – svallory 2009-11-29 18:57:18

0

我對此表示懷疑。如果考慮一下你需要編寫的手動SQL查詢來將外部連接查詢中的所有關係都拉出來,你可以看到爲什麼NHibernate很難生成這樣的東西。更新將是一個更大的頭痛 - 你如何決定哪個id在新的關係的哪個領域?

如果你被困在這個模型上,我建議作爲一個解決方法是映射兩個私人收藏並實現一個Union()ed只讀公共集合。實現更新/刪除方法,找到&修改適當的關係,以及循環法的Add()方法。對於此集合的查詢,您不會有任何NHibernate查詢支持。

您的其他選擇是更改您的數據模型,以便用戶與關係具有多對多關係(例如UserRelation表),依靠應用程序代碼實施「每個關係兩個用戶」規則並添加方便的方法,如IList<User> GetRelations(RelationType)