Как не допустить, чтобы мой оператор Include () заполнил коллекцию включенной сущности? - PullRequest
0 голосов
/ 31 декабря 2018

Я использую EF Core 2.1, первый подход к базе данных .Я пытаюсь включить () объект внешнего ключа при извлечении моей целевой коллекции объектов, но происходит нечто странное.

Структура объекта - Job -> JobStatus.Я выбираю некоторые объекты Job и хочу включить свойство внешнего ключа JobStatus в Job. Проблема в том, что сущность JobStatus имеет свойство ICollection [Job], которое заполняет каждое задание из базы данных. Это приводит к тому, что полезная нагрузка имеет размер в гигабайтах.

Когда я включаюJobStatus на работе, я хотел бы удовлетворить одно из следующих решений.Я также открыт для других решений или обходных путей, о которых я не думал.* как я могу предотвратить заполнение свойства JobStatus ICollection?* Или я могу запретить Entity Framework генерировать это свойство в первую очередь?

Я уже исследовал Игнорирование ReferenceLoopHandling

services.AddMvc().AddJsonOptions(options => {
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

Вот сущности, автоматически генерируемые Entity Framework.

public partial class Job
{
    public long Id { get; set; }
    public long StatusId { get; set; }

    public JobStatus Status { get; set; }
}

public partial class JobStatus
{
    public JobStatus()
    {
        Job = new HashSet<Job>();
    }

    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public ICollection<Job> Job { get; set; }
}

Пример кода, вызывающего проблему

var jobs = _context.Set<Job>()
    .Where(job => job.Id == 1)
    .Include(job => job.Status);

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Один из способов избежать заполнения коллекции Job - это явно выбрать столбцы, которые вы хотите вернуть, либо через определенный, либо анонимный тип:

var jobs = _context.Set<Job>()
    .Where(job => job.Id == 1)
    .Include(job => job.Status)
    .Select(job => new
    {
        Id = job.Id,
        StatusName = job.Status.Name
    });
0 голосов
/ 31 декабря 2018

Добавить "виртуальное" ключевое слово.Любые виртуальные ICollections будут загружаться с отложенной загрузкой, если вы не отметите их иначе.

public virtual ICollection<Job> Job { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...