2013-05-06 154 views
0

我使用實體框架5.0,實體框架鏈接表

方案

「組織」具有與「客戶」的列表和「期間」列表的「CurrentPeriodID」在每個時期開始時,部分或全部「客戶」與該「」「期間」相關聯,這是我使用鏈接表完成的,並且這適用於O K所以當我做「Organisation-> Period-> Clients」我得到一個「客戶」列表「期間」

接下來,我需要一些對象(「活動」)添加到「客戶」「週期」,所以我得到「Organisation->週期 - >客戶端 - >激活」這將不會是唯一一個最終會有幾個其他導航屬性,將需要添加到「客戶端」「活動」,他們都必須是「期間」有關,I也必須能夠做到(如果可能的話)「組織 - >期間活動」

問題

會是什麼,我不介意什麼樣的方式是做的Code First逆向工程實施爲「Organisation->期客戶」「活動」的最佳途徑等。另外關於建立「組織」對象的我可以加載使用電流「週期」對象「CurrentPeriodID」,其被存儲在「組織」對象值。

感謝

回答

0

對我來說,這聽起來像你需要連接PeriodClientActivity額外的實體,我們稱之爲ClientActivityInPeriod。這個實體 - 和相應的表 - 將有三個外鍵和三個引用(並且沒有集合)。我想讓這個實體的主鍵是三個外鍵的組合,因爲這個組合必須是唯一的。它看起來像這樣(在代碼優先的風格):

public class ClientActivityInPeriod 
{ 
    [Key, ForeignKey("Period"), Column(Order = 1)] 
    public int PeriodId { get; set; } 

    [Key, ForeignKey("Client"), Column(Order = 2)] 
    public int ClientId { get; set; } 

    [Key, ForeignKey("Activity"), Column(Order = 3)] 
    public int ActivityId { get; set; } 

    public Period Period { get; set; } 
    public Client Client { get; set; } 
    public Activity Activity { get; set; } 
} 

所有這三個外鍵需要(因爲屬性不能爲空)。

PeriodClientActivity可以集合指的這個實體(但他們並不需要),例如在Period

public class Period 
{ 
    [Key] 
    public int PeriodId { get; set; } 

    public ICollection<ClientActivityInPeriod> ClientActivities { get; set; } 
} 

你不能像Clients集合導航屬性在Period,將包含有特定期間內的任何活動,所有客戶端,因爲這需要有一個外鍵從ClientPeriodClientPeriod之間的許多一對多的鏈接表。只有當客戶端在Period中有活動時纔會填充外鍵或鏈接表。 EF和數據庫都不會幫助您處理這樣的業務邏輯。您必須對此進行編程,並確保如果在期間添加或刪除了活動,則關係正確更新 - 這很容易出錯並且存在數據一致性的風險。

相反,你會獲取通過查詢在一定時期內1活動,而不是由一個導航屬性的客戶,例如用:

var clientsWithActivitiesInPeriod1 = context.Periods 
    .Where(p => p.PeriodId == 1) 
    .SelectMany(p => p.ClientActivities.Select(ca => ca.Client)) 
    .Distinct() 
    .ToList();