1

Я manay-ко-многим между двумя сущностями: Категории < -> ПредметыEF - как предотвратить жадную загрузку, чтобы загрузить все вложенные объекты

public class CategoryMaster 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual List<SubCategoryMaster> SubCategories { get; set; } 

    public List<ItemMaster> Items { get; set; } 
} 

public class ItemMaster 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public List<CategoryMaster> Categories { get; set; } 
} 

Всякий раз, когда я пытаюсь явных связанных нагрузочных элементов в все/некоторые категории, это дает мне

  • всех связанных элементов
  • связанные категории для этих элементов
  • элементов, связанных с теми са рубрикатор и так далее ... вложенные/циклические ссылки

    db.CategoryMaster 
         .Include(x=>x.Items) 
         .Include(x=>x.SubCategories.Select(y=>y.Items)) 
         .ToList(); 
    

Следовательно приводит ниже ошибки при сериализации в JSON на * .cshtml с Json.Encode();

A circular reference was detected while serializing an object of type 'GoGreen.Data.Entities.SubCategoryMaster'. 

Так как я отключил отложенной загрузки на уровне собственности, я не ожидал, что это загрузит все вложенные объекты (циклические ссылки) в любой момент времени. Есть ли способ загрузить все связанные записи уровня один, т. Е. Категории и связанные элементы.

Related question - Но Iodon't не хочет идти ни с одним из предложенных способов.

ПРИМЕЧАНИЕ: Меня больше интересует, почему EF ведет себя так. Кажется, это ошибка.

+0

проверьте ответ и скажите мне, помогло ли это вам или нет. –

+0

Вы должны заменить JSon сериалайзер на Json.NET и установить обработку опорного контура. –

ответ

0

Первый подход: вы можете добавить атрибут выше свойства, которые вы не хотите, чтобы исключить его из сериализации с помощью [ScriptIgnore], вы можете создать частичный класс и добавить настройки, если ваши объекты сгенерированы автоматически

Второй подход: создание модель с только свойствами вам нужно в просмотре и выбрать только эту модель и установить свойства

EFcontext.Tabel.include(x=>x...).Select(x=>new MyModel { ... }); 
+0

В этом подходе нет ничего плохого, но я не буду этого делать, поскольку я ожидаю некоторого исправления в самой структуре EF. – RollerCosta

0

Один из способов, и, пожалуйста, не убивайте меня :-) После объекта погрузки и до сериализации, просто установить загруженную объекты, вызывающие круговую ссылку на null. Я попробовал и работал как шарм.