Eu tenho 2 entidades que estão relacionadas como uma para muitas
public class Restaurant {
public int RestaurantId {get;set;}
public string Name {get;set;}
public List<Reservation> Reservations {get;set;}
...
}
public class Reservation{
public int ReservationId {get;set;}
public int RestaurantId {get;set;}
public Restaurant Restaurant {get;set;}
}
Se eu tentar obter restaurantes com reservas usando minha API
var restaurants = await _dbContext.Restaurants
.AsNoTracking()
.AsQueryable()
.Include(m => m.Reservations).ToListAsync();
.....
Eu recebo erro na resposta, porque os objetos contêm referências um ao outro. Existem posts relacionados que recomendam a criação de um modelo separado ou a adição da configuração do NewtonsoftJson
O problema é que eu não quero criar um modelo separado e a segunda sugestão não ajudou. Existe alguma maneira de carregar dados sem relação ciclada? *
System.Text.Json.JsonException: um possível ciclo de objeto foi detectado e não é suportado. Isso pode ser devido a um ciclo ou se a profundidade do objeto for maior que a profundidade máxima permitida de 32. no System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (Int32 maxDepth) no System.Text.Json.JsonSerializer.Write (Utf8JsonWriter writer , Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions opções, WriteStack & state) em System.Text.Json.JsonSerializer.WriteAsyncCore (Stream utf8Json, Valor do objeto, Tipo inputType, JsonSerializerOptions opções, CancellationToken canceltingTextServiceFormattersTextSystem.Text. WriteResponseBodyAsync (contexto OutputFormatterWriteContext, Encoding selectedEncoding) em Microsoft.AspNetCore.Mvc.
*
fonte
Respostas:
Eu tentei o seu código em um novo projeto e a segunda maneira parece funcionar bem após a instalação do pacote Microsoft.AspNetCore.Mvc.NewtonsoftJson, primeiramente para o 3.0
Tente com um novo projeto e compare as diferenças.
fonte
.NET Core 3.1 Instale o pacote Microsoft.AspNetCore.Mvc.NewtonsoftJson
Startup.cs Adicionar serviço
fonte
A configuração das opções de serialização JSON na inicialização é provavelmente a maneira preferida, pois você provavelmente terá casos semelhantes no futuro. Enquanto isso, entretanto, você pode tentar adicionar atributos de dados ao seu modelo para que ele não seja serializado: https://www.newtonsoft.com/json/help/html/PropertyJsonIgnore.htm
fonte
Acima funcionou também. Mas eu prefiro o seguinte
Como primeiro precisamos adicionar o atributo a todos os modelos, podemos ter a referência cíclica.
fonte