Ich habe 2 Entitäten, die als eins zu viele verwandt sind
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;}
}
Wenn ich versuche, Restaurants mit Reservierungen über meine API zu bekommen
var restaurants = await _dbContext.Restaurants
.AsNoTracking()
.AsQueryable()
.Include(m => m.Reservations).ToListAsync();
.....
Ich erhalte eine Fehlerantwort, da Objekte Verweise aufeinander enthalten. Es gibt verwandte Beiträge, die empfehlen , ein separates Modell zu erstellen oder eine NewtonsoftJson-Konfiguration hinzuzufügen
Das Problem ist, dass ich kein separates Modell erstellen möchte und der zweite Vorschlag nicht geholfen hat. Gibt es eine Möglichkeit, Daten ohne zyklische Beziehung zu laden? * *
System.Text.Json.JsonException: Es wurde ein möglicher Objektzyklus erkannt, der nicht unterstützt wird. Dies kann entweder auf einen Zyklus zurückzuführen sein oder wenn die Objekttiefe größer ist als die maximal zulässige Tiefe von 32. bei System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (Int32 maxDepth) bei System.Text.Json.JsonSerializer.Write (Utf8JsonWrit , Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions-Optionen, WriteStack & state) bei System.Text.Json.JsonSerializer.WriteAsyncCore (Stream utf8Json, Objektwert, Typ inputType, JsonSerializerOptions-Optionen WriteResponseBodyAsync (OutputFormatterWriteContext-Kontext, Codierung selectedEncoding) bei Microsoft.AspNetCore.Mvc.
* *
quelle
Antworten:
Ich habe Ihren Code in einem neuen Projekt ausprobiert und der zweite Weg scheint gut zu funktionieren, nachdem das Paket Microsoft.AspNetCore.Mvc.NewtonsoftJson zunächst für 3.0 installiert wurde
Versuchen Sie es mit einem neuen Projekt und vergleichen Sie die Unterschiede.
quelle
.NET Core 3.1 Installieren Sie das Paket Microsoft.AspNetCore.Mvc.NewtonsoftJson
Startup.cs Dienst hinzufügen
quelle
Das Einstellen der JSON-Serialisierungsoptionen beim Start ist wahrscheinlich eine bevorzugte Methode, da in Zukunft wahrscheinlich ähnliche Fälle auftreten werden. In der Zwischenzeit können Sie jedoch versuchen, Ihrem Modell Datenattribute hinzuzufügen, damit es nicht serialisiert wird: https://www.newtonsoft.com/json/help/html/PropertyJsonIgnore.htm
quelle
Oben hat auch funktioniert. Aber ich bevorzuge folgendes
Da wir zuerst das Attribut zu allen Modellen hinzufügen müssen, haben wir möglicherweise die zyklische Referenz.
quelle