Бесконечный цикл создания объектов
Создал связь многие ко многим между Userом и Company. При регистрации пользователя в IdentityController, создается бесконечный цикл создания User
a и 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. Самое забавное, что если использовать всё тоже самое, но в консольном приложении, никакой проблемы не возникнет.
Источник: Stack Overflow на русском