2012-08-02 4 views
0

Je crée un administrateur MCV ouvert dans les heures, dans lequel j'ai un horaire de classe contenant une ICollection de ExceptionHoursSets, chaque HoursSet contenant en outre un WeekSpec. (Les ExceptionHoursSets contiennent heures qui définissent des exceptions à un schéma général des heures WeekSpec également contenu dans l'annexe.)Première chargement du code EF avec la propriété ICollection

Schedule.cs (en abrégé):

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 (également abrégé):

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 (encore): abrégé

using System; 
using System.ComponentModel.DataAnnotations; 

namespace HoursAdmin.Models 
{ 
    public class DaySpec 
    { 
     [Required] 
     public Guid DaySpecId { get; set; } 

     // Good old misc props 
    } 
} 

Si je récupérer le Schedule, la collection HoursSet se charge, mais WeekSpec de chaque HoursSet est null. Je suis actuellement disposé à ignorer le sens lancinante que je devrais utiliser uniquement le code du premier chargement, et d'interroger manuellement pour le WeekSpec dont l'ID correspond à celle stockée en tant que clé étrangère du ExceptionHoursSet:

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); 
    } 
} 

Cependant, cela est répétitif et fastidieux. .. si quelqu'un d'esprit fournirait comment cela devrait être fait?

P.S. - La réponse fournie dans Auto-retrieve ICollection of complex type with Code First ne fonctionnera pas, car comme vous pouvez le voir, je ne peux pas mettre un prop de nav dans WeekSpec à son entité parente, puisque cette entité peut être un Schedule ou un ExceptionHoursSet (voir How to define an MVC database structure using the same sub-table in different super-tables).

Très apprécié,
Nathan Bond

Répondre

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

grâce, qui l'a fait. J'avais essayé une sorte de chargement impatient avant mais ça ne marcherait pas. Au début, le vôtre ne fonctionnait pas non plus; Puis j'ai découvert que je n'utilisais pas System.Data.Entity, donc je n'ai pas eu l'extension Include. – NargothBond

Questions connexes