Net Core - .Include () приводит к циклу, приводящему к отладке Visual Studio для сбоя

asp.net-core-mvc dbcontext eager-loading entity-framework-core visual-studio-2017

Вопрос

Моя база данных имеет отношение «один ко многим» между «UsageRecord» и «Dimension»,

Диаграмма базы данных

Это моделируется следующим образом (с использованием подхода Database-First):

public partial class Dimension
    {               
        ...          
        public virtual ICollection<UsageRecord> UsageRecord { get; set; }       
    }

Использование Класс записи:

      public partial class UsageRecord
        {
            public long Id { get; set; }
            ...
            public long DimensionId { get; set; }    
            public virtual Dimension Dimension { get; set; }              
        }

Итак, если я запрашиваю список UsageRecords (EagerLoading):

_context.Set<UsageRecord>.Where(x => x.ProductId == productId).ToList()

Я получаю список объектов UsageRecord, с которыми я могу перемещаться во время отладки: запись об использовании

Обратите внимание, что объект Dimension имеет значение NULL, и это правильно, поскольку я не включил его в запрос.

Теперь, если я попытаюсь включить его, приложение выйдет из строя:

_context.Set<UsageRecord>.Where(x => x.ProductId == productId).Include(p => p.Dimension).ToList();

авария

Почтальон выходит с ошибкой 502, а VS Debug сначала показывает список вопросительных знаков «?» перед сбоем.

Я думаю, это связано с тем, что, включив объект Dimension, это повторяется через список присоединенных приложений UsageRecords, а затем Dimension снова и снова.

Как я могу избежать этого?

Популярные ответы

Чтобы получить результат из запроса LINQ, вы можете решить свою проблему следующими способами:

  • Настройте сериализатор для игнорирования циклов
  • Создайте модель представления для действия вашего контроллера
  • Использовать анонимный тип для выбора результата в действии вашего контроллера


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow