0

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

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

如果我检索时间表,则会加载 HoursSet 集合,但每个 HoursSet 的 WeekSpec 都是空的。我目前倾向于忽略我应该只使用 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);
    }
}

然而,这是重复和乏味的......所以有人介意提供这应该如何完成吗?

PS - Auto-retrieve ICollection of complex type with Code First 中提供的答案不起作用,因为如您所见,我无法在 WeekSpec 中将导航道具放置到其父实体,因为该实体可能是 Schedule 或一个 ExceptionHoursSet(请参阅如何使用不同超表中的相同子表定义 MVC 数据库结构)。

非常感谢,
内森邦德

4

1 回答 1

0
 var schedules = db.Schedules
    .Include(s => s.WeekSpec)
    .Include(s => s.ExceptionHoursSets)
    .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec))
    .ToList();
于 2012-08-02T13:56:58.703 回答