Объект внешнего ключа не заполняется в EF4 - PullRequest
1 голос
/ 03 марта 2011

Я бы подумал, что это очень простые вещи, но я просто не заставляю их работать.

Я пытаюсь получить список объектов, используя лямбда-выражения, например:

 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 Ответ

3 голосов
/ 03 марта 2011

По умолчанию 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);
}
...