2014-10-23 2 views
1

У меня есть следующие классы сущностей:Entity Framework: Получить детей

public class History : BaseEntity 
    { 
     public string Version { get; set; } 
     public DateTime? ReleaseDate { get; set; } 
     public string Name { get; set; } 
     public string Additional { get; set; } 
     public List<HistoryEntry> Entries { get; set; } 
    } 

    public class HistoryEntry : BaseEntity 
    { 
     public string Version { get; set; }   
     public string BugNr { get; set; } 
     public AllowedTypes EntryType { get; set; } 
     public string Description { get; set; } 
     public History Parent { get; set; } 
    } 

    public enum AllowedTypes 
    { 
     Bug, Enhancement 
    } 

которые отображаются таким образом:

public HistoryMap() 
     { 
      ToTable("History"); 
      HasKey(c => c.Version); 
      Property(c => c.Version).HasMaxLength(10); 
      Property(c => c.Name).HasMaxLength(200); 
     } 

это приводит к двум таблицам, которые действуют так же, как я хотел («История» имеет «Версия» в качестве первичного ключа, а «HistoryEntry» имеет внешний ключ «Версия», который связан с «Историей». «Версия»

После добавления некоторого материала в эти таблицы я пытаюсь прочитать содержимое:

IQueryable<History> query = _historyRepository.Table.OrderByDescending(c => c.ReleaseDate); 
var historyList = new List<Core.Domain.Tengo.History>(query); 

В то время как все записи истории считаются успешно, свойство «Записи», если объект «История» всегда равен NULL.

Как достичь того, что связанные элементы также прочитаны и сохранены в Записи?

+4

попытки установить навигационное свойство 'virtual' как' публичного виртуального List Запись {получить; задавать; } ' – tschmit007

ответ

4

Навигационные характеристики, такие как ICollection<T>/IList<T>, должны быть отмечены как virtual. Это позволяет EntityFramework переопределять их и предоставлять код для ленивой загрузки свойств.

Так линия (в History классе)

public List<HistoryEntry> Entries { get; set; } 

должны стать

public virtual List<HistoryEntry> Entries { get; set; } 
2

Yves ответ является правильным, если вы хотите использовать отложенной загрузки.

Другой способ сделать это - использовать Eager Loading. Нежелательная загрузка загружает свойства сразу, а не когда к нему обращаются. В нижеприведенном фрагменте используется Eager Loading.

_historyRepository.Table.Include(x=>x.Entries).OrderByDescending(c => c.ReleaseDate); 

Разница между ленивым и жадными загрузками объясняется в ссылке ниже:

http://www.dotnet-tricks.com/Tutorial/entityframework/RIWW210913-Difference-between-Lazy-Loading-and-Eager-Loading.html

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