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).