如何加载IEnumerable <t> </t>类型的相关实体

时间:2011-10-29 16:29:00

标签: c# entity-framework entity-framework-4

我正在尝试加载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; }
    }

如何正确加载相关实体?

2 个答案:

答案 0 :(得分:6)

IEnumerable<T>不支持作为导航集合的类型。您必须使用ICollection<T>或从其派生的其他界面(例如IList<T>)或ICollection<T>的具体实现 - 例如List<T>HashSet<T>等。< / p>

答案 1 :(得分:2)

那是因为你需要ICollection而不是IEnumerable。