Прекратить загрузку самоссылающихся сущностей во многих ко многим - PullRequest
0 голосов
/ 24 марта 2019

У меня есть отношение многие ко многим в структуре сущностей, и это вызывает у меня проблемы с сериализацией, поскольку бесконечность цикла (с использованием newtonsoft) я получаю: Обнаружена ошибка: Самостоятельная ссылка на цикл:

Я пробовал установку параметров из Самостоятельная ссылка на цикл Entity FrameWork

 config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling 
= Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

Но это не помогает.Мои классы выглядят так:

public class Job
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<Job> Jobs { get; set; }
}

Так что в .net, когда я выполняю поиск вакансий, могу ли я сказать, что после этого снова включаются только теги, а не вакансии?Т.е. с:

   // How to not include jobs in tags object?
   var jobs = context.Job.Include(x => x.Tags);

1 Ответ

1 голос
/ 25 марта 2019

Простой ответ: «Не отправляйте объекты клиенту, используйте модель представления».

Если все, о чем заботится ваш клиент, - это Job и список его тегов:

[Serializable]
public class JobViewModel
{
    public int JobId { get; set;}
    public string Title { get; set; } 
    public List<TagViewModel> Tags { get; set; } = new List<TagViewModel>();
}
[Serializable]
public class TagViewModel
{
    public int TagId { get; set; }
    public string Title { get; set; }
}

Затем выберите все вакансии и их теги: (в идеале это должен быть пункт Where или разбиение на страницы, но ради примера)

var jobs = context.Jobs.Select(j => new JobViewModel
{
    JobId = j.JobId,
    Title = j.Title,
    Tags = j.Tags.Select(t => new TagViewModel
    {
        TagId = t.TagId,
        Title = t.Title
    }).ToList()
}).ToList();

Вы можете избежать этого ручного приведения, используя AutoMapper и его метод ProjectTo<T>, который прекрасно интегрируется с методами IQueryable EF.

var jobs = context.Jobs
    .ProjectTo<JobViewModel>()
    .ToList();

Почему?

  • Избегать проблем с циклической сериализацией ссылок.
  • Оптимизация запросов, отправляемых в базу данных, для получения только необходимых полей.
  • Сокращение использования памяти на серверах и клиенте.
  • Уменьшите объем данных, передаваемых по проводам между серверами и клиенту.
  • Избегайте отправки клиенту большего количества данных, чем необходимо.(в противном случае не показана модель всего домена)
  • Избегайте риска получения объектов от клиента, присоединения и сохранения изменений, которые не были предназначены.(отладчик изменяет поля или связанные объекты вручную)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...