我正在做一个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();