我正在制作一个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}})。
非常感谢,
内森邦德
答案 0 :(得分:0)
var schedules = db.Schedules
.Include(s => s.WeekSpec)
.Include(s => s.ExceptionHoursSets)
.Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec))
.ToList();