2012-01-18 59 views
2

你好,我試圖做不可能顯然。多對多(自我相關)特定訂單實體框架

我需要一個自我引用的表,它具有多對多的關係,它首先在c#實體框架(4.2)數據庫中也具有特定的順序。

認爲它像朋友有朋友,他們在那裏排列他們的友誼>最壞的朋友,以最壞的朋友。

無論如何不使用「FriendToFriend」關係實體來做到這一點?我希望能夠使用Friend.Friends(刪除訂單欄創建它),但我會根據他們的friendshipOrder有一個默認的訂單。我的工作看起來像擴展生成的類,以便爲朋友提供一個新的屬性。

其他人有什麼更好的想法?

回答

2

實體框架不支持有序集合。這是EF顯示其不成熟的許多情況之一。

嘗試nHibernate,如果它是一個可行的選項。它supports ordered collections

對於EF,您必須將中間表與額外的列對應起來,並根據您的邏輯手動調整順序。

+0

感謝您的答覆。我基本上必須按照我在問題中描述的方式來解決它。我希望更多的人能夠回答,但是除了大量修改SSDL,我不認爲這是一個答案,我不想讓我的腦袋纏繞數日。 – psy 2012-01-26 14:52:49

1

我知道我遲到了,但是在將其設計爲數據模型時,我更願意添加關係表,並且該關係表應該有一個用於定義順序的屬性(例如,最差的朋友是0,最好是100)。

然後,在EF中,如果我檢索的列表應該是該順序,那麼我將明確地通過該屬性進行排序。

這意味着無論您用什麼方法查詢數據,該關係都可以始終如一地使用。所以,如果你使用EF,你可以使用它(雖然,是的,它不像Friend.Friends那麼方便,但是代碼會更清晰地表明它的意圖 - Friend.FriendRelationships.Select(p => p.Friend) .OrderBy(p => p.OrderValue)),如果您使用的是直接SQL,那麼您也可以使用它。

如果我在代碼中遇到Friend.Friends,我不知道將對其應用什麼排序。

如果你必須有,雖然它,你可以隨時添加它作爲一個非DB屬性 -

public class Friend 
{ 
    public virtual List<FriendRelationship> UnorderedFriendList { get; set; } 

    [NotMapped] 
    public IEnumerable<Friend> Friends 
    { 
    get 
    { 
     return UnorderedFriendList.Select(p => p.Friend).OrderByDescending(p => p.OrderValue); 
    } 
    } 
}