LINQ to Entities возвращает неверный идентификатор для дочернего объекта сущности - PullRequest
2 голосов
/ 07 октября 2011

У меня есть структура таблицы в MySql, настроенная с помощью внешних ключей:

Period {Id, Title}

Активность {Id, Title, PeriodId}

Resource {Id, FileName}

ActivityResources {ActivityId, ResourceId}

Это настроено для LINQ-to-Entities, и я проверил правильность отображений таблиц, включая отношение многие ко многим. Обычно все хорошо работает с классами Period, Activity и Resource.

Однако я пытаюсь использовать этот код:

private string ListAttachments(Ctx ctx) {
  var resList = new StringBuilder();
  var p = ctx.Periods.Include("Activities.Resources").Single(o => o.Id == 1);
  foreach (var a in p.Activities) foreach (var r in a.Resources)
    resList.Append(r.Id).Append(" - ").Append(r.FileName);
  return resList.ToString();
}

Но он не записывает Resource.Id для каждого ресурса, как ожидалось; почему-то вместо этого записывается Activity.Id (хотя FileName является правильным).

Есть идеи, что происходит?

EDIT

Кстати, это работает нормально, но я все еще заинтересован в тесте в приведенном выше коде.

private string ListAttachments(Ctx ctx) {
  var resList = new StringBuilder();
  var res = ctx.Resources.Where(r => r.LessonActivities.Any(l => l.LessonId == 1)).ToList();
  foreach (var r in res) resList.Append(r.Id).Append(" - ").Append(r.FileName);
  return resList.ToString();
}

1 Ответ

0 голосов
/ 06 апреля 2012

Не думаю, что вы можете ссылаться на дочерние / дочерние коллекции таким образом.Свойство навигации Activities объекта Period является коллекцией.И вы не можете ссылаться на свойство, которое принадлежит экземпляру объекта через коллекцию этих объектов.

Другими словами, Period p имеет коллекцию Activities.Но коллекция типа Activity не не имеет коллекцию Resources.Только один Activity имеет коллекцию Resources.

Что я не понимаю, так это почему первый фрагмент работает вообще.

В любом случае, чтобы попасть в коллекцию Resources непосредственно из Period, вам нужно будет использовать SelectMany().Что-то вроде

List<Resource> resources = ctx.Periods
                              .Where(p=>p.Id == 1)
                              .SelectMany(p=>p.Activities)
                              .SelectMany(a => a.Resources)
                              .ToList();
...