0

私は MCV 営業時間管理者を作成しています。このクラスには、ExceptionHoursSets の ICollection を含むクラス Schedule があり、各 HoursSet にはさらに WeekSpec が含まれています。(ExceptionHoursSets には、Schedule にも含まれる一般的な 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
    }
}

スケジュールを取得すると、HoursSet コレクションが読み込まれますが、各 HoursSet の WeekSpec は null です。私は現在、Code First の読み込みのみを使用する必要があるというしつこい感覚を無視し、ExceptionHoursSet の外部キーとして格納されているものと一致する ID を持つ 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 -- Code First を使用した複雑なタイプの ICollection の自動取得で提供される回答は機能しません。 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 に答える