2013-08-06 2 views
0

В предыдущих попытках со старыми версиями Entity Framework я привык использовать Eager Loading - так что вы получаете свой корневой объект и затем собираете связанные объекты, как требуется, с помощью «Include».Entity Framework загружает избыточные данные

В моем текущем проекте мы внедрили последнюю версию EF в новую базу данных, используя сначала базу данных. Возьмите этот класс, например:

public partial class Zone 
{ 
    public Zone() 
    { 
     this.OverrideCharges = new HashSet<OverrideCharge>(); 
    } 

    public System.Guid RowId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<OverrideCharge> OverrideCharges { get; set; } 
} 

В OverrideCharges объект также имеет ряд подсвойств под ним, со смежными организациями, находящимися под них.

У нас есть два контекста: фактический контекст БД и набор контекстов DTO. Объекты для последних в основном являются копиями первого - объект Zone_dto является в значительной степени клоном оригинала. В обеих случаях, я выключил отложенную загрузку с помощью:

public CContext(): base("BreezeMetaData") 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 

    public UDBEntities() 
     : base("name=UDBEntities") 
    { 
     this.Configuration.LazyLoadingEnabled = false; 
    } 

Теперь я запрашиваю мои объекты пояса, делая это:

public List<Zone_dto> GetZones() 
    { 
     List<Zone> zones = _cilContext.Zones.ToList(); 
     List<Zone_dto> zone_dtos = new List<Zone_dto>(); 

     foreach (Zone zn in zones) 
     { 
      zone_dtos.Add(Mapper.Map<Zone, Zone_dto>(zn)); 
     } 

     return zone_dtos; 
    } 

Так что - не включает. И Lazy Loading отключен. Я ожидал бы вернуть список объектов Zone и их прямых свойств, но не связанные с ними объекты.

Но я вернусь к объектам Zone, а также всем их OverrideCharges, а также всем связанным объектам с этими OverrideCharges и т. Д., Вплоть до дерева.

Эти объекты данных не огромны, и это не является серьезной проблемой. Но я расстроен тем, что не понимаю, почему я возвращаю все эти данные, о которых я не просил. Может кто-нибудь объяснить?

+0

Вы отключите LazyLoading для всего жизненного цикла контекста или просто для этой операции? Ваш контекст мог бы потенциально загрузить данные перед этой операцией, и, создав этот список, вы все увидите (так как загрузка была сделана до того, как вы отключили ленивую загрузку). – Chris

+0

Это отключено в конструкторе - см. Edit –

ответ

1

То, что вы описываете, - это именно то, что я ожидал бы - вы, кажется, ленивы и нетерпеливы.

Lazy loading означает, что контекст не загрузит все - он ленив, потому что он меньше работает и загружает только то, что вы просите специально. .Include() необходим, когда есть is ленивая загрузка, потому что вы говорите ей не быть ленивым о том, что вы есть Include() ing.

Нежелательная загрузка означает, что контекст загрузит все, что вам может понадобиться, прежде чем вы их попросите, следуя ссылкам с запрошенным вами товаром и загрузив все, что они приведут. При отключенной ленивой загрузке не нужно сообщать Include() вещам, потому что он будет загружать все по умолчанию. Использование .Include() называется нетерпеливой загрузкой, потому что вы говорите ему использовать поведение с высокой загрузкой для этого свойства; с полной загрузкой по умолчанию, вам не нужно .Include().

Установить LazyLoadingEnabled = true; и посмотреть, что произойдет.

+0

Кажется, не имеет абсолютно никакого значения - точно такие же данные возвращаются. Это говорит о том, что проблема находится где-то еще в коде. Не знаю, где. –

+0

Даже если вы задали соответствующие свойства 'virtual'? – anaximander

+0

Ага. Если я задал тогда * не * виртуальный, он загружает только базовые свойства. Правильно, спасибо - можете ли вы настроить EF для создания моделей с не виртуальными свойствами навигации? –

0

Возможно, это связано с ключевым словом virtual. Виртуальная ICollection будет загружена лениво.

См. Это SO link.

+0

Спасибо, но уже попробовали это. Все еще загружает полное дерево. –

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