EF代码首次加载未完成ICollection属性

时间:2012-08-02 13:52:06

标签: asp.net-mvc ef-code-first

我正在制作一个MCV开放时间管理员,其中我有一个包含ICollection ExceptionHoursSets的课程表,每个HoursSet还包含一个WeekSpec。 (ExceptionHoursSets包含定义例外中包含的一般WeekSpec小时模式的例外的小时数。)

Schedule.cs(缩写):

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace HoursAdmin.Models
{
    public class Schedule
    {
        [Required]
        public Guid ScheduleId { get; set; }

        // Miscellaneous props

        // General hours pattern
        public Guid WeekSpecId { get; set; }
        public virtual WeekSpec WeekSpec { get; set; }

        // All exceptions to that pattern
        virtual public ICollection<ExceptionHoursSet> ExceptionHoursSets { get; set; }
    }
}

ExceptionHoursSet.cs(也缩写):

using System;
using System.ComponentModel.DataAnnotations;

namespace HoursAdmin.Models
{
    public class ExceptionHoursSet
    {
        [Required]
        public Guid ExceptionHoursSetId { get; set; }

        // More misc props

        public Guid WeekSpecId { get; set; }
        [Required]
        public WeekSpec WeekSpec { get; set; }
    }
}

WeekSpec.cs(简称):

using System;
using System.ComponentModel.DataAnnotations;

namespace HoursAdmin.Models
{
    public class DaySpec
    {
        [Required]
        public Guid DaySpecId { get; set; }

        // Good old misc props
    }
}

如果我检索Schedule,则加载HoursSet集合,但每个HoursSet的WeekSpec为null。我现在倾向于忽略我只应该使用Code First加载的唠叨感,并手动查询其ID与存储为ExceptionHoursSet的外键的那些相匹配的WeekSpec:

public ViewResult Index()
{
    using (var db = new HoursDb())
    {
        var schedules = db.Schedules.ToList();
        foreach (var schedule in schedules)
        {
            var exceptionHoursSets = schedule.ExceptionHoursSets;
            foreach (var exceptionHoursSet in exceptionHoursSets)
            {
                var weekSpec = db.WeekSpecs.FirstOrDefault(d => d.WeekSpecId == 
                    exceptionHoursSet.WeekSpecId);
                exceptionHoursSet.WeekSpec = weekSpec;
                db.Entry(weekSpec).Collection(w => w.DaySpecs).Load();
            }
        }
        return View(schedules);
    }
}

然而,这是重复而乏味的......所以有人会介意如何做到这一点吗?

P.S。 - Auto-retrieve ICollection of complex type with Code First中提供的答案将不起作用,因为您可以看到我无法将WeekSpec中的导航道具放到其父实体中,因为该实体可能是Schedule或ExceptionHoursSet(请参阅{{ 3}})。

非常感谢,
内森邦德

1 个答案:

答案 0 :(得分:0)

 var schedules = db.Schedules
    .Include(s => s.WeekSpec)
    .Include(s => s.ExceptionHoursSets)
    .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec))
    .ToList();