2013-05-02 17 views
0

我正在執行一些看似難以執行的EF代碼優先關係。我搜索了堆棧溢出以及網頁,但似乎無法提供任何東西。我有一個簡單的課程如下。一個程序的PK是它的ID。它還有一個(非PK)FamilyId值。沒有「家庭」表或類似的東西。此外,「FamilyId」不是不同計劃實體的Id值的FK。在我看來,我認爲這是一種「分組」。EF代碼優先:在配置中的非關鍵屬性上進行鏈接

public class Program 
{ 
    public int Id { get; set; } 

    public virtual List<Program> RelatedPrograms { get; set; } 
    public int? FamilyId { get; set; } 
} 

讓我再解釋一些示例數據。

ID:1,FAMILYID:17
ID:2,FAMILYID:17
ID:3,FAMILYID:18
ID:4,FAMILYID:17

在我的配置使用EF代碼優先我想添加一些邏輯,如果我對這三個中的任何一個進行查詢,就會在程序1,2和4中填充「RelatedPrograms」屬性(例如,這裏的要點是它們都通過此仲裁彼此相關屬性)。如果我查詢程序3,在RelatedPrograms屬性中只有1條記錄,它將是程序3,因爲沒有其他人共享相同的FamilyId。

我認爲我的邏輯需要類似於以下內容,除了以下內容自動引用幕後的Id列,我需要我的鏈接完全基於正在訪問的程序的FamilyId列和數據庫中其他程序的FamilyId值。

this.HasMany(p => p.RelatedPrograms).WithRequired().HasForeignKey(p => p.FamilyId);

任何幫助,你可以提供這一點,將不勝感激。

謝謝!

回答

0

如果我得到這個權利,你只是想知道一組基於屬性,家庭ID的程序?這聽起來不像程序對象的屬性,而是一組程序。我只想有程序標識和系列ID(這聽起來更像是一個類我)在計劃實體,而當你需要知道的有關方案,你只要查詢實體:

var relatedPrograms = context.Programs.Where(p => p.FamilyId == myFamilyId).ToList(); 
+0

是的,我我很熟悉這一點。然而,在我的常規「Get」方法之後,它會接受單獨的數據庫調用。我想簡單地調用一個DbContext.Programs.SingleOrDefault(p => p.Id == parameterId)。您的推薦解決方案就是我通過這一點所掌握的;我正在尋找一種方法來加強這種方法。 – KWondra 2013-05-03 18:37:18

+0

我會建議保持目前的做法。這種抽象是概念性的,不是物理的,你的數據庫不會保存外鍵。你的「家庭」節目是一個羣體,每個人都是相關的,它不是親子關係,而是兄弟姐妹關係。讓EF做一些不在數據庫中的東西會使事情變得更加複雜而不是簡單。 – gabnaim 2013-05-03 18:51:34