對我來說,這聽起來像你需要連接Period
,Client
和Activity
額外的實體,我們稱之爲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; }
}
所有這三個外鍵需要(因爲屬性不能爲空)。
Period
,Client
和Activity
可以集合指的這個實體(但他們並不需要),例如在Period
:
public class Period
{
[Key]
public int PeriodId { get; set; }
public ICollection<ClientActivityInPeriod> ClientActivities { get; set; }
}
你不能像Clients
集合導航屬性在Period
,將包含有特定期間內的任何活動,所有客戶端,因爲這需要有一個外鍵從Client
到Period
或Client
和Period
之間的許多一對多的鏈接表。只有當客戶端在Period
中有活動時纔會填充外鍵或鏈接表。 EF和數據庫都不會幫助您處理這樣的業務邏輯。您必須對此進行編程,並確保如果在期間添加或刪除了活動,則關係正確更新 - 這很容易出錯並且存在數據一致性的風險。
相反,你會獲取通過查詢在一定時期內1
活動,而不是由一個導航屬性的客戶,例如用:
var clientsWithActivitiesInPeriod1 = context.Periods
.Where(p => p.PeriodId == 1)
.SelectMany(p => p.ClientActivities.Select(ca => ca.Client))
.Distinct()
.ToList();