2013-03-16 2 views
2

У меня проблема с загрузкой EF 5 и Lazy циклическими ссылками.Entity Framework 5 Cyclic Lazy Загрузка Причина OutOfMemoryException

Нижеследующее изображение представляет мою модель. enter image description here

Основная проблема заключается в классе Model и ModelProperties, поскольку Model содержит свойство навигации IEnumerable, а ModelProperty содержит свойство навигации модели.

Так эта конструкция вызывает ситуацию ниже enter image description here

Вы можете получить доступ к полноразмерному изображению http://tinypic.com/r/2vskuxl/6

Как вы можете себе представить эту причину очень большая проблема, OutOfMemory исключения.

Только решение, которое я могу найти, отключает ленивую загрузку и использует другие методы. Но ленивая загрузка очень упрощает нашу работу. Надеюсь, что есть конфигурация или атрибут, который поможет мне загружать только два уровня отношений с ленивой загрузкой.

Есть ли способ достичь этого?

ОБНОВЛЕНИЕ: Относительно запроса от Джули Лерман, здесь представлена ​​визуальная модель EF. Я выделил основное отношение, которое вызывает проблему. enter image description here Также вы можете получить доступ к полноразмерному на http://tinypic.com/r/30v15pg/6

UPDATE 2: Вот определение модели.

public class Model { 
     public int ModelID { get; set; } 
     public int BrandID { 
      get; 
      set; 
     } 
     public virtual Brand Brand { get; set; } 
     public string Logo { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<ModelProperty> ModelProperties { 
      get; 
      set; 
     } 
} 

public class ModelProperty { 

    public int ModelPropertyID { 
     get; 
     set; 
    } 

    public virtual int PropertyDefinitionID { 
     get; 
     set; 
    } 

    public virtual PropertyDefinition PropertyDefinition { 
     get; 
     set; 
    } 

    public virtual int ModelID { 
     get; 
     set; 
    } 

    public virtual Model Model { 
     get; 
     set; 
    } 

    public bool IsContainable { 
     get; 
     set; 
    } 

    public bool HasFilterDefinition { 
     get; 
     set; 
    } 

    public virtual ICollection<ModelPropertyValue> ModelPropertyValues { 
     get; 
     set; 
    } 

    public virtual ICollection<ModelPropertyMatchingFilter> ModelPropertyMatchingFilter { 
     get; 
     set; 
    } 
} 

Также существует конфигурация объекта для ModelProperty.

public class ModelPropertyEntityTypeConfiguration : EntityTypeConfiguration<ModelProperty> { 
     public ModelPropertyEntityTypeConfiguration() { 
      HasKey(p => p.ModelPropertyID); 

      HasRequired(p => p.PropertyDefinition).WithMany(s => s.ModelProperties).HasForeignKey(s => s.PropertyDefinitionID).WillCascadeOnDelete(false); 
      HasRequired(p => p.Model).WithMany(s => s.ModelProperties).HasForeignKey(s => s.ModelID).WillCascadeOnDelete(false); 
      HasMany(p => p.ModelPropertyValues).WithRequired(s => s.ModelProperty).HasForeignKey(s => s.ModelPropertyID).WillCascadeOnDelete(true); 
      HasMany(p => p.ModelPropertyMatchingFilter).WithRequired(s => s.ContainerModelProperty).HasForeignKey(s => s.ContainerModelPropertyID).WillCascadeOnDelete(false); 
      ToTable("dbo.ModelProperties"); 
     } 
    } 

UPDATE 3: Я не уверен, но Automapper может вызвать это также. Поскольку Entity Framework Profile сообщает тысячам методов Autommaper, вызываемых во время работы.

UPDATE 4: Вот ЭфПроф StackTrace: enter image description here Доступ большая версия http://tinypic.com/r/21cazv4/6

UPDATE 5 Вы можете увидеть образец проекта здесь: https://github.com/bahadirarslan/AutomapperCircularReference В образце, вы можете увидеть легко бесконечны петли через Quick watch.

+1

Bahadir, я предполагаю, что вы используете код сначала, поэтому не имеете EDMX для просмотра. Можете ли вы использовать инструмент EF Power Tool для создания визуального представления вашей модели и поделиться ею здесь? Если вы не знаете, как использовать этот инструмент, я показываю его примерно в 19:00 в этом видео: http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Entity-Framework-Tips-and- Tricks # time = 19m00s –

+0

Можете ли вы показать фрагмент кода, который вызывает «OutOfMemoryException»? В quickview вы можете развернуть вечно, но тогда вы запускаете ленивую загрузку самостоятельно. Какой код или процесс в вашем приложении вызывает проблемы? –

+0

@JulieLerman Я добавил визуальную модель EF. Надеюсь, это поможет. –

ответ

1

Благодарим за обновление. Вы модель хорошо выглядит. Это определенно знает, что это всего лишь отношения 1: *. Ладислав (как обычно) правильный. LL не вызывает проблемы ... кроме ОДНОГО места, которое во время сериализации. Есть ли вероятность, что у вас есть код в службе? При регулярной ленивой загрузке загружается только те вещи, которые вы явно упоминаете. Но во время сериализации сериализация «упоминает» каждое свойство, поэтому он просто сохраняет свойства загрузки и загрузки по всему графику И вызывает проблемы с циклической зависимостью. С помощью служб мы должны отменить ленивую загрузку (используя context.configuration.lazyloadingenabled = false), прежде чем вы вернете данные.Таким образом, в методе обслуживания вы можете получать нагрузку или ленивую нагрузку или явно загружать, чтобы получить свой график, но затем отключите ленивую загрузку, прежде чем возвращать результаты.

+0

Спасибо за ответ. Это очень интересно, я думал иначе. Я разделял уровни, EF находится в DbCore, и есть общий шаблон репозитория и UoW. В этих слоях есть класс Domain Service, а наверху - метод Web API. Так где я могу отключить ленивую загрузку? –

+0

Я пробовал много вещей, но stil не смог найти лучшего решения. Также нетерпеливая загрузка ведет себя очень интересно, чем я думал. –

+0

Вы можете использовать что-то вроде профилировщика Entity Framework и точно определить, что запускает ленивую загрузку? –

1

вы должны отключить ленивую загрузку, чтобы обойти прокси-объекты, или вы должны вернуть то, что вам нужно, как DTO. использование DTO является предпочтительным из-за скрытия деталей вашего домена.

+0

Спасибо за ответ. На самом деле я использую DTO и возвращаю их из API после преобразования с Automapper. Но мне нужны эти отношения и в верхних слоях. Но не все из них, один или два уровня для меня. –

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