2013-08-30 92 views
3

好的,這應該很簡單,但我有麻煩。我有兩個類的區域和位置。一個地區可以有多個地點,但一個地區只能在一個地區。簡單的東西。這是我有:EF代碼第一關係的故障

Location    Region 
---------   ------- 
int LocationID  int RegionID  
string Name   string Name 
string BlahBlah  List<Location> Locations 
string OtherStuff 
int RegionID 
Region Region 

現在我需要添加一個家庭辦公室到一個地區。家庭辦公室也是一個位置。實體框架似乎困惑,所以我顯然做錯了事情。這是我想要做的:

Location    Region 
---------   ------- 
int LocationID  int RegionID  
string Name   string Name 
string BlahBlah  List<Location> Locations 
string OtherStuff int HomeOfficeID 
int RegionID   Location HomeOffice 
Region Region 

我在這裏錯過了什麼?

如果你不喜歡我寫上面這裏是類:

public class Region 
{ 
    public int RegionID { get; set; } 
    public string Name { get; set; }  
    public int HomeOfficeID { get; set; } 
    public virtual Location HomeOffice { get; set; } 
    public virtual List<Location> Locations { get; set; } 
} 

public class Location 
{ 
    public int LocationID { get; set; } 
    public string Name { get; set; }    
    public int RegionID { get; set; } 
    public virtual Region Region { get; set; } 
} 
+2

我認爲在大多數領域中'HomeOffice'可能不僅僅是一個位置,儘管位置可能是它的一個屬性。 – Alex

+0

即使這樣也不能解決循環外鍵依賴問題。 – Aron

+0

我想如果我有一個具有區域和位置屬性的HomeOffice類,它可能變得更容易。 – georgewillow

回答

1

因此,如果「家庭辦公室」真的有比任何其他位置沒有其它數據,有一個變通方法:

Location    Region 
---------   ------- 
int LocationID  int RegionID  
string Name   string Name 
string BlahBlah  List<Location> Locations 
string OtherStuff 
int RegionID   
Region Region 
bool IsHomeOffice 

現在,地區得到了只讀屬性:

public Location HomeOffice 
{ 
    get { return Locations.FirstOrDefault(l => l.IsHomeOffice); } 
} 

您還需要一些驗證合作以確保您最終不會將多個位置分配給IsHomeOffice,但這會讓您開始。

編輯:評論讓我意識到這種方法不允許HomeOffice位於該地區以外的位於。可以發生?首先想到的可能性不大,但也許「家庭辦公室」確實意味着一個地區的人力資源部門人員所在的位置。目前,HomeOffice始終在該地區,但未來該公司可以決定爲某個地區遠程辦公。在這個有限的例子中,適應不會太痛苦,但是隨着數據模型變得越來越複雜,當數據模型的結構需要改變時,它會變得更加痛苦。不要總是依靠結構來執行規則,而應考慮保持結構的靈活性並在輸入時添加數據驗證。

+0

這意味着家庭辦公室的位置不可重複使用。可能是一個有效的假設。 – Matthew

+0

@Mathew這對我來說似乎是合理的,否則一個位置可能是它不屬於的區域的HomeOffice。這沒有任何意義。 – cadrell0

+0

謝謝,我認爲這將對我有用。 – georgewillow