外键对象未填写EF4

时间:2011-03-03 19:13:19

标签: c# entity-framework-4 linq-to-entities

我认为这是非常基本的东西,但我只是没有让它发挥作用。

我尝试使用像这样的lambda表达式获取对象列表:

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

获取列表,但外键对象都为null。 我也尝试过使用LINQ实体,但这会导致同样的问题:

        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);

1 个答案:

答案 0 :(得分:3)

默认情况下,Entity Framework仅引入您指定的集合,不带任何外来对象。如果启用了延迟加载,则访问外部属性将导致它们被懒惰地初始化。如果没有,您需要告诉实体框架急切地加载第一批所需的属性。

有两种方法可以做到这一点。第一种是“官方”方式,但我不喜欢它,因为它使用魔术字符串:

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);
}

由于Entity Framework足够聪明,可以建立适当的连接,因此您可以再使用一个选择器并避免使用匿名类型:

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);
}