Ich habe mit der Erstellung einer Website experimentiert, die MVC mit JSON für meine Präsentationsebene und das Entity Framework für Datenmodell / Datenbank nutzt. Mein Problem tritt beim Serialisieren meiner Modellobjekte in JSON auf.
Ich verwende die erste Codemethode, um meine Datenbank zu erstellen. Bei der ersten Codemethode erfordert eine Eins-zu-Viele-Beziehung (Eltern / Kind), dass das Kind einen Verweis auf das Elternteil hat. (Beispielcode Ich bin ein Tippfehler, aber Sie bekommen das Bild)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
Bei der Rückgabe eines "parent" -Objekts über ein JsonResult wird ein Zirkelverweisfehler ausgegeben, da "child" eine Eigenschaft der Klasse parent hat.
Ich habe das ScriptIgnore-Attribut ausprobiert, aber ich verliere die Fähigkeit, die untergeordneten Objekte zu betrachten. Ich muss irgendwann Informationen in einer übergeordneten untergeordneten Ansicht anzeigen.
Ich habe versucht, Basisklassen für Eltern und Kind zu erstellen, die keinen Zirkelbezug haben. Leider werden beim Versuch, baseParent und baseChild zu senden, diese vom JSON-Parser als abgeleitete Klassen gelesen (ich bin ziemlich sicher, dass mir dieses Konzept entgeht).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
Die einzige Lösung, die ich gefunden habe, ist die Erstellung von "View" -Modellen. Ich erstelle einfache Versionen der Datenbankmodelle, die keinen Verweis auf die übergeordnete Klasse enthalten. Diese Ansichtsmodelle verfügen jeweils über eine Methode zum Zurückgeben der Datenbankversion und einen Konstruktor, der das Datenbankmodell als Parameter verwendet (viewmodel.name = databasemodel.name). Diese Methode scheint erzwungen, obwohl es funktioniert.
HINWEIS: Ich poste hier, weil ich denke, dass dies mehr Diskussion wert ist. Ich könnte ein anderes Entwurfsmuster verwenden, um dieses Problem zu lösen, oder es könnte so einfach sein, wie ein anderes Attribut für mein Modell zu verwenden. Bei meiner Suche habe ich keine gute Methode gefunden, um dieses Problem zu lösen.
Mein Endziel wäre eine schöne MVC-Anwendung, die JSON in hohem Maße für die Kommunikation mit dem Server und die Anzeige von Daten nutzt. Während ein konsistentes Modell über mehrere Ebenen hinweg beibehalten wird (oder so gut ich kann).
quelle
Eine einfachere Alternative zum Versuch, die Objekte zu serialisieren, besteht darin, die Serialisierung von übergeordneten / untergeordneten Objekten zu deaktivieren. Stattdessen können Sie einen separaten Anruf tätigen, um die zugeordneten übergeordneten / untergeordneten Objekte nach Bedarf abzurufen. Dies ist möglicherweise nicht ideal für Ihre Anwendung, aber eine Option.
Dazu können Sie einen DataContractSerializer einrichten und die DataContractSerializer.PreserveObjectReferences- Eigenschaft im Konstruktor Ihrer Datenmodellklasse auf 'false' setzen. Dies gibt an, dass die Objektreferenzen beim Serialisieren der HTTP-Antworten nicht beibehalten werden sollen.
Beispiele:
Json-Format:
XML-Format:
Dies bedeutet, dass beim Abrufen eines Elements, auf das untergeordnete Objekte verwiesen werden, die untergeordneten Objekte nicht serialisiert werden.
Siehe auch die DataContractsSerializer- Klasse.
quelle
JSON-Serializer, der sich mit Zirkelreferenzen befasst
Hier ein Beispiel für einen benutzerdefinierten Jackson
JSONSerializer
, der sich mit Zirkelverweisen befasst, indem er das erste Vorkommen serialisiert undreference
bei allen nachfolgenden Vorkommen ein * für das erste Vorkommen speichert .Umgang mit Zirkelreferenzen beim Serialisieren von Objekten mit Jackson
Relevantes Teil-Snippet aus dem obigen Artikel:
quelle
Das Nötigste an Daten auszusenden, ist die einzig richtige Antwort. Wenn Sie Daten aus der Datenbank senden, ist es normalerweise nicht sinnvoll, jede einzelne Spalte mit allen Zuordnungen zu senden. Die Verbraucher sollten sich nicht mit Datenbankzuordnungen und -strukturen befassen müssen, dh mit Datenbanken. Dies spart nicht nur Bandbreite, sondern ist auch viel einfacher zu warten, zu lesen und zu konsumieren. Fragen Sie die Daten ab und modellieren Sie sie dann für das, was Sie tatsächlich benötigen, um Gl. das bloße Minimum.
quelle
.Include(x => x.TableName )
Keine Rückgabe von Beziehungen (von der Haupttabelle zur abhängigen Tabelle) oder nur eine Datenzeile, HIER BEHEBEN:/programming/43127957/include-not-working-in-net-core-returns-one-parent
Stellen Sie außerdem in Startup.cs sicher, dass Sie dies oben haben:
quelle