我正在制作一个 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 数据库结构)。
非常感谢,
内森邦德