Бесконечный цикл создания объектов

Рейтинг: 0Ответов: 0Опубликовано: 07.04.2023

Ошибка: введите сюда описание изображения

Создал связь многие ко многим между Userом и Company. При регистрации пользователя в IdentityController, создается бесконечный цикл создания Usera и Company.

[HttpPost("Register")]
    public async Task<IActionResult> Register(User user)
    {
        if (string.IsNullOrWhiteSpace(user.LastName)
            || string.IsNullOrWhiteSpace(user.FirstName)
            || string.IsNullOrWhiteSpace(user.PhoneNumber)) return BadRequest(user);

        if (await _applicationContext.Users
            .FirstOrDefaultAsync(u => u.PhoneNumber == user.PhoneNumber) != null) return BadRequest(user);

        Company? company = new Company("Тестовая компания");

        if (company != null) user.Companies.Add(company);

        await _applicationContext.Users.AddAsync(user);
        await _applicationContext.SaveChangesAsync();

        User? result = await _applicationContext.Users
            .FirstOrDefaultAsync(u => u.PhoneNumber == user.PhoneNumber);

        return CreatedAtAction(nameof(IdentityController.Register), result);
    }

public class User
{
    [Key]
    public ulong Id { get; private set; }

    [Column("LastName", TypeName = "nvarchar(50)")]
    public string LastName { get; private set; }

    [Column("FirstName", TypeName = "nvarchar(50)")]
    public string FirstName { get; private set; }

    [Column("PhoneNumber", TypeName = "varchar(50)")]
    public string PhoneNumber { get; private set; }

    public List<Company>? Companies { get; private set; } = new();

    public User(string lastName, string firstName, string phoneNumber)
    {
        Id = default;
        LastName = lastName ?? string.Empty;
        FirstName = firstName ?? string.Empty;
        PhoneNumber = phoneNumber ?? string.Empty;
    }
}

public class Company
{
    [Key]
    public ulong Id { get; private set; }

    [Column("FullName", TypeName = "nvarchar(MAX)")]
    public string FullName { get; private set; }

    public List<User>? Users { get; private set; } = new();

    public List<CheckPoint>? CheckPoints { get; private set; } = new();

    public Company(string fullName)
    {
        Id = default;
        FullName = fullName;
    }
}

Во всём просторе необъятного интернета нашел лишь одно решение:

services.AddControllers().AddJsonOptions(x =>
                x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);

Вопрос следующий: Является ли это костыльным решением и есть ли какие-нибудь лаконичные методы решения данной проблемы?

Вывод: введите сюда описание изображения

P.S. Самое забавное, что если использовать всё тоже самое, но в консольном приложении, никакой проблемы не возникнет.

Ответы

Ответов пока нет.