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



我正在做一个MCV开放时间管理,其中我有一个包含ExceptionHoursSet的ICollection的类Schedule,每个HoursSet还包含一个WeekSpec。(ExceptionHoursSet包含的小时定义了时间表中也包含的一般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。我目前倾向于忽略这种恼人的感觉,即我应该只使用代码优先加载,并手动查询WeekSpec,其ID与存储为ExceptionHoursSet的外键的ID匹配:

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);
    }
}

然而,这是重复和乏味的。。。那么,有人介意提供应该如何做到这一点吗?

第页。S.——在使用Code First的复杂类型的Auto retrieve ICollection中提供的答案不起作用,因为正如您所看到的,我不能将WeekSpec中的nav道具放在其父实体中,因为该实体可能是Schedule或ExceptionHoursSet(请参阅如何在不同的超级表中使用相同的子表定义MVC数据库结构)。

非常感谢,
Nathan Bond

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

最新更新