2

我正在使用EF 4.1 CTP5和SQL Server 2008.我需要了解如何解決重複性問題。我有以下2類:併發性問題實體框架

public class Nation 
{ 
    public int ID {get; set;} 
    public string name {get;set;} 
    public List<NationAlly> NationAllies {get;set;} 
} 

public class NationAlly 
{ 
    public int ID {get; set;} 
    public int level {get;set;} 
    public Nation Owner {get; set;} 
    public Nation toNation {get;set;} 
} 

的實體映射到兩個表(國家和NationAllies)數據庫。此外,還有兩種關係。 1)從NationAllies.OwnerID到Nation.ID 2)從NationAllies.ToNationID到Nation.ID

當我嘗試從我的數據庫檢索國家類型的對象,我訪問的DbContext類NationDB:

Nation selectedNation = ((nationDB.Nations.Include("NationAllies")).Where(m => m.name == "France")).FirstOrDefault(); 

問題是我得到一個具有NationAllies列表的selectedNation對象,但列表中的每個NationAlly都具有toNation = null的字段。 首先,我希望字段toNation從數據庫中檢索正確的信息。我該怎麼做呢?

當然,國家將與其他國家聯盟相連,而聯盟其他國家也將擁有其他國家。怎麼可能建立一個遞歸圖?我的想法是通過以特定方式查詢數據庫來導航地圖直到某個級別。這樣做,有什麼最好的方法來獲得良好的速度表現?

+0

你如何映射這些實體。首先,您的代碼不會與您的查詢進行覈對,因爲'Nation'中的'name'是整數。另外默認的映射會把'toNation'指向你的情況下的父實體法國。不會有遞歸。 – 2011-03-26 14:18:35

+0

1)更正了Nation.name中的錯誤類型2)增加了關於映射的描述 – Francesco 2011-03-26 15:47:31

+0

@Ladislav:您有遞歸意義,即每個國家都可以有幾個NationAlly(s)。每個國家在國家領域都有一個國家,而這個國家又可以有幾個國家。在這種情況下,將創建整個層次結構組織或地圖。地圖的邊界當然是有限的(最後是沒有產生新分支的「葉子」,即沒有盟友的國家)或無限(國家都彼此相互關聯) – Francesco 2011-03-26 16:08:55

回答

2

它看起來像NationAllies是具有附加屬性的聯結表。問題是,如果您沒有在Include方法中明確指定它們,EF不會加載嵌套的導航屬性。如果你想有toNation填寫您必須使用

nationDB.Nations.Include("NationAllies.toNation") 

nationDB.Nations.Include(n => n.NationAllies.Select(na => na.toNation)) 

您還可以啓用延遲加載。使所有導航屬性爲virtualtoNationNationOwnerNationAllies),除非關閉上下文,否則所有屬性將在您第一次訪問它們時加載。

+0

好。問題通過使用方法#1解決。方法#2看起來非常有趣:如果我理解正確,上下文將在我訪問它們時將對象加載到內存中?這意味着,當我「導航地圖」到該屬性時,toNation屬性將自動檢索數據庫值? – Francesco 2011-03-26 16:52:03

+0

是的,它是數據庫中select語句的惰性執行。 – 2011-03-26 17:18:28

+0

它就像一個魅力!大!謝謝! – Francesco 2011-03-26 18:29:17