2012-08-02 57 views
0

我正在製作一個MCV開放時間管理員,其中包含一個包含ExceptionHoursSet集合的ICollection類,每個HoursSet進一步包含一個WeekSpec。 (該ExceptionHoursSets包含用於定義例外一般WeekSpec小時圖案也包含在附表小時。)EF代碼優先加載不完成ICollection屬性

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。我目前配置忽略,我應該只使用代碼第一次加載和手動查詢其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(請參閱How to define an MVC database structure using the same sub-table in different super-tables)。

大加讚賞,
彌敦道債券

回答

0
var schedules = db.Schedules 
    .Include(s => s.WeekSpec) 
    .Include(s => s.ExceptionHoursSets) 
    .Include(s => s.ExceptionHoursSets.Select(e => e.WeekSpec)) 
    .ToList(); 
+0

感謝,認爲做到了。我以前嘗試過某種熱切的加載方式,但它不起作用。起初,你們也沒有工作;然後我發現我沒有使用System.Data.Entity,所以我沒有得到Include擴展。 – NargothBond 2012-08-02 14:11:47