2012-06-01 2 views
1

У меня возникли проблемы с получением всех данных из базы данных, и я не совсем уверен, что я делаю неправильно, почти все это для меня нова ,Объекты дочерних объектов MVC4 EF4.3 не извлекаются из базы данных

Я искал SO и нашел следующий вопрос, который кажется довольно похож на мой - Repository Pattern for Entity Framework and Children Objects

I've looked at the answer which contained this link, но я изо всех сил, чтобы получить эту работу.

У меня есть мой репозиторий кампании, который возвращает кампанию. Он возвращает список аудитов, как ожидалось, но у Аудитов нет комментариев или Кампании в них. Есть ли что-то особенное, что мне нужно сделать, чтобы сообщить БД вытащить все каскадные объекты?

Спасибо за любую помощь

Нил

public override Campaign Get(int id) 
    { 
     var query = Context.Campaigns.Include(x => x.Audits) 
            .FirstOrDefault(c => c.CampaignId == id); 
     if (query != null) 
      Logger.Trace(query.ToString()); 
     return query; 
    } 

У меня есть моя кампания класса

public class Campaign 
{ 
    public Campaign() 
    { 
     Audits = new Collection<Audit>(); 
    } 

    public int CampaignId { get; set; } 

    [StringLength(40, ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "CampaignModel_Name_StringLength")] 
    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "CampaignModel_Name_Required")] 
    [Display(Name = "CampaignModel_Name", ResourceType = typeof(Resources.Resources))] 
    public string Name { get; set; } 

    public ICollection<Audit> Audits { get; set; } 
} 

И мой аудит класс

public class Audit 
{ 
    public Audit() 
    { 
     Comments = new Collection<Comment>(); 
    } 

    public int AuditId { get; set; } 

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_CampaignAction_Required")] 
    [Display(Name = "Audit_CampaignAction", ResourceType = typeof(Resources.Resources))] 
    public CampaignAction Action { get; set; } 

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_UserName_Required")] 
    [Display(Name = "Audit_UserName_Content", ResourceType = typeof(Resources.Resources))] 
    public string UserName { get; set; } 

    [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "Audit_TimeStamp_Required")] 
    [Display(Name = "Audit_TimeStamp", ResourceType = typeof(Resources.Resources))] 
    public DateTime TimeStamp { get; set; } 

    public ICollection<Comment> Comments { get; set; } 

    [JsonIgnore] 
    public virtual ICollection<Campaign> Campaigns { get; set; } 
} 
+0

Вы также пытались маркировки методы, как 'virtual', как это должно быть проще, чтобы получить данные без необходимости использовать' Include' – Kane

ответ

2

До тех пор, пока вы используете жадной загрузки , вы вызывать Include() для всех объектов, которые вы хотите загрузить из базы данных. Это правило применяется для дочерних объектов (аудитов), но также для внуков (действие и комментарии).

Обычно вы должны использовать простую точечную обозначение для включения внуков, но если дочерний объект является коллекцией, существует специальный синтаксис с использованием метода Select().

Ваш запрос должен выглядеть

var query = Context.Campaigns.Include(x => x.Audits) 
          .Include(x => x.Audits.Select(a => a.Comments)) 
          .Include(x => x.Audits.Select(a => a.Action)) 
          .FirstOrDefault(c => c.CampaignId == id); 
+0

Brilliant, спасибо миллиона – Neil

Смежные вопросы