Mam 2 podmioty, które są powiązane jako jeden do wielu
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;}
}
Jeśli spróbuję dostać restauracje z rezerwacjami za pomocą mojego interfejsu API
var restaurants = await _dbContext.Restaurants
.AsNoTracking()
.AsQueryable()
.Include(m => m.Reservations).ToListAsync();
.....
W odpowiedzi pojawia się błąd, ponieważ obiekty zawierają odniesienia do siebie. Istnieją pokrewne posty, które zalecają utworzenie osobnego modelu lub dodanie konfiguracji NewtonsoftJson
Problem polega na tym, że nie chcę tworzyć osobnego modelu, a druga sugestia nie pomogła. Czy istnieje sposób ładowania danych bez relacji cyklicznej? *
System.Text.Json.JsonException: Wykryto możliwy cykl obiektu, który nie jest obsługiwany. Może to wynikać z cyklu lub głębokości obiektu jest większa niż maksymalna dozwolona głębokość 32. w System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (Int32 maxDepth) w System.Text.Json.JsonSerializer.Write (Utf8JsonWriter writer , Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions opcje, WriteStack & state) w System.Text.Json.JsonSerializer.WriteAsyncCore (Stream utf8Json, wartość obiektu, typ inputType, JsonSerializerOptions opcje, CancellationTput.TransruptTextMot. WriteResponseBodyAsync (kontekst OutputFormatterWriteContext, kodowanie selectedEncoding) w Microsoft.AspNetCore.Mvc.
*
źródło
Odpowiedzi:
Próbowałem kodu w nowym projekcie i drugi sposób wydaje się działać dobrze po zainstalowaniu pakietu Microsoft.AspNetCore.Mvc.NewtonsoftJson po raz pierwszy dla 3.0
Wypróbuj nowy projekt i porównaj różnice.
źródło
.NET Core 3.1 Zainstaluj pakiet Microsoft.AspNetCore.Mvc.NewtonsoftJson
Startup.cs Dodaj usługę
źródło
Wprowadzenie ustawienia opcji serializacji JSON podczas uruchamiania jest prawdopodobnie preferowanym sposobem, ponieważ prawdopodobnie będziesz mieć podobne przypadki w przyszłości. W międzyczasie możesz jednak spróbować dodać atrybuty danych do swojego modelu, aby nie był serializowany: https://www.newtonsoft.com/json/help/html/PropertyJsonIgnore.htm
źródło
Powyżej również działało. Ale wolę następujące
Ponieważ najpierw musimy dodać atrybut do wszystkich modeli, możemy mieć cykliczne odwołanie.
źródło