Обнаружен возможный цикл объектов. Это может быть связано с циклом или если глубина объекта превышает максимально допустC#

Место общения программистов C#
Anonymous
Обнаружен возможный цикл объектов. Это может быть связано с циклом или если глубина объекта превышает максимально допуст

Сообщение Anonymous »

Я столкнулся с действительно странной ситуацией. Я разрабатываю API net 5 и (среди других объектов) имею три таблицы: «Доктор», «Специализация» и «ДокторСпециализация». Мои объекты:

Код: Выделить всё

public class Doctor
{
public int Id { get; set; }
public string Name { get; set; }
public string Resume { get; set; }
public ICollection DoctorSpecializations { get; set; }
}

public class DoctorSpecialization
{
public int Id { get; set; }
public int Doctor1Id { get; set; }
[ForeignKey("Doctor1Id")]
public Doctor1 Doctor { get; set; }

public int Specialization1Id { get; set; }
[ForeignKey("Specialization1Id")]
public Specialization1 Specialization { get; set; }
}

public class Specialization
{
public int Id { get; set; }
public string SpecializationName { get; set; }
}
Я хочу получить все специализации, связанные с определенным врачом, поэтому я создал сервис:

Код: Выделить всё

public class DoctorService : IDoctorService
{
public async Task GetAllSpecializationsForDoctor(int id)
{
var doctor = await _context.Doctors.Where(x => x.Id == id).FirstOrDefaultAsync();

var doctorSpecializations = await _context.DoctorSpecializations.
Where(x => x.DoctorId == doctor.Id)
.ToListAsync();

IEnumerable ids = doctorSpecializations.Select(x => x.SpecializationId);

var specializations = await _context.Specializations.Where(x =>
ids.Contains(x.Id)).ToListAsync();
return specializations;
}
}
В конце я добавляю в свой контроллер метод, который должен получать специализации на основе идентификатора врача:

Код: Выделить всё

[HttpGet("specializations/{id}")]
public async Task GetSpecializationsForDoctor(int id)
{
var doctor = await _doctorService.FindDoctorById(id);

if (doctor == null) return NotFound();

var specialization = _doctorService.GetAllSpecializationsForDoctor(id);

return Ok(specialization);
}
Когда я запускаю это в почтальоне, я получаю ошибку, указанную в заголовке этого вопроса. Однако я нашел статью, в которой объясняется, что мне следует установить newtonsoft.json и внести некоторые изменения в свой запуск, чтобы решить эту проблему. Поэтому я установил Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.10" и внес изменения в свой запуск следующим образом:

Код: Выделить всё

 services.AddControllers().AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore);
На этот раз я получаю ожидаемый результат, но мой почтальон показывает массу данных, прежде чем выдать мне желаемый результат, и мне интересно, можно ли вернуть такой большой объем данных клиенту. Может кто-нибудь объяснить мне, что происходит, заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/695 ... -the-objec

Вернуться в «C#»