Как загрузить связанные сущности типа IEnumerable‹T›

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

Свойство навигации типа IEnumerable не является единственной реализацией типа ICollection.

Я пытался сделать это несколькими способами и в конечном итоге получил ту же ошибку выше для каждого запроса в контексте (я включил другие способы в комментарии).

using(var context = CustomObjectContextCreator.Create())
        {
            return  context.Job.Include("Surveys").Include("SiteInfoes")
        .Where(r => r.Jobid == jobId).SingleOrDefault();

            //context.ContextOptions.LazyLoadingEnabled = false;
            //var Job = context.Job.Where(r => r.Jobid == jobId).SingleOrDefault();
            //context.LoadProperty(Job, "Surveys");
            //context.LoadProperty(Job, "SiteInfoes");

            //var Job = (from j in context.Job
            //                   .Include("Surveys")
            //                   .Include("SiteInfoes")
            //               select j).SingleOrDefault();

            //var Job = context.Job.Where(r => r.Jobid == jobId).SingleOrDefault();
            //var surveys = context.Surveys.Where(s => s.JobID == jobId);
            //var wellInfoes = context.SiteInfoes.Where(w => w.Jobid == jobId);
            //Job.Surveys = surveys.ToList();
            //Job.SiteInfoes = wellInfoes.ToList();

            //return Job;
        }

Вот объекты POCO, которые я использую:

    public class Job
    {
        public int? Jobid { get; set; }
        public string JobLocation { get; set; }
        public string JobName { get; set; }
        public virtual IEnumerable<Survey> Surveys { get; set; }
        public virtual IEnumerable<SiteInfo> SiteInfoes { get; set; }
    }

public class Survey
    {
        public int SurveyID { get; set; }
        public int? JobID { get; set; }
        public DateTime? DateTime { get; set; }
        public string Report { get; set; }
        public virtual Job Job { get; set; }
    }

public class SiteInfo
    {
      public int Jobid { get; set; }
      public string SiteLocation { get; set; }
      public virtual JobInfo JobInfo { get; set; }
    }

Как правильно загрузить связанные сущности?


person Rich    schedule 29.10.2011    source источник


Ответы (2)


IEnumerable<T> не поддерживается в качестве типа коллекции навигации. Вы должны использовать ICollection<T> или другой производный от него интерфейс (например, IList<T>) или конкретную реализацию ICollection<T> — например, List<T>, HashSet<T> и т. д.

person Slauma    schedule 29.10.2011
comment
похоже, это то, что мне говорило исключение. Спасибо за разъяснения. - person Rich; 29.10.2011
comment
Не могли бы вы объяснить, ПОЧЕМУ IEnumerable‹T› не поддерживается? - Я очень хотел бы знать. - person Matthew Layton; 04.06.2016

Это потому, что вам нужен ICollection вместо IEnumerable.

person Piotr Perak    schedule 29.10.2011