2011-03-03 44 views
1

我認爲這是非常基本的東西,但我只是沒有得到它的工作。EF4中沒有填寫外鍵對象

我試圖讓使用這樣的lambda表達式對象的列表:

List<LocalizationGlobalText> list = _entities.LocalizationGlobalTexts.Where(l => l.Language.Id == _currentlanguage).ToList<LocalizationGlobalText>(); 

名單是牽強,但國外主要對象均爲空。 我也使用LINQ to實體嘗試,但這會導致同樣的問題:

 IEnumerable<LocalizationGlobalText> bla = (from lgt in _entities.LocalizationGlobalTexts 
                join lg in _entities.LocalizationGlobals on lgt.IdLocalizationGlobal equals lg.Id 
                where lgt.IdLanguage == _currentlanguage 
                select lgt); 
+0

可能的複製見:http://stackoverflow.com/questions/5173890/entity-framework-4-eager-loading-not-working-at-all/5174303#5174303 – TGnat 2011-03-03 19:19:02

回答

3

默認情況下,實體框架不僅帶來您所指定的集合中,沒有任何異物。如果啓用了延遲加載,則訪問外部屬性將導致它們被懶惰地初始化。如果沒有,你需要告訴實體框架,以便在第一批時加載你想要的屬性。

有兩種方法可以做到這一點。第一個是「官方」的方式,但由於它使用了神奇的字符串,我不喜歡它:

var list = _entities.LocalizationGlobalTexts.Include("ForeignProp") 
       .Where(l => l.Language.Id == _currentlanguage) 
       .ToList<LocalizationGlobalText>(); 

(替換「ForeignProp」你想讓它急切地加載屬性的名稱)

第二種方法是設置你的選擇,使其將被迫拉這個額外的數據:

var list = _entities.LocalizationGlobalTexts 
       .Where(l => l.Language.Id == _currentlanguage) 
       .Select(l => new {l, l.ForeignProp}) 
       .ToList(); 

foreach(var item in list) 
{ 
    Console.WriteLine(item.l.Name + item.ForeignProp.Title); 
} 

由於實體框架是足夠聰明,都做出了相應的連接,你可以扔在一個多選擇並避免使用後面的匿名類型:

var list = _entities.LocalizationGlobalTexts 
       .Where(l => l.Language.Id == _currentlanguage) 
       .Select(l => new {l, l.ForeignProp}) 
       .AsEnumerable() // tells EF to load now. The rest is LINQ to Objects 
       .Select(i => i.l) 
       .ToList(); 

foreach(var localization in list) 
{ 
    Console.WriteLine(localization.Name + localization.ForeignProp.Title); 
} 
+0

什麼是第二種方式?你只提一個。 – neontapir 2011-03-03 19:25:15

+0

@neontapir:我正在研究它。看我的編輯。 – StriplingWarrior 2011-03-03 19:26:31

+0

良好的概述。 第一個選項有效,在我看來最容易實現,但我也不是魔術字符串的粉絲。 當我嘗試將第二個選項結果轉換爲List 時,出現錯誤。 所以我結束了使用第三個版本,但是像這樣。 List list = ... ToList (); – redrobot 2011-03-03 19:41:40