Une référence circulaire a été détectée lors de la sérialisation d'un objet de type 'SubSonic.Schema .DatabaseColumn'.

.net c# entity-framework json subsonic

Question

J'essaie de faire une simple déclaration JSON, mais j'ai des problèmes. J'ai les éléments suivants ci-dessous.

public JsonResult GetEventData()
{
    var data = Event.Find(x => x.ID != 0);
    return Json(data);
}

Je reçois un HTTP 500 à l'exception de ce qui est indiqué dans le titre de cette question. J'ai aussi essayé

var data = Event.All().ToList()

Cela a donné le même problème.

Est-ce un bug ou mon implémentation?

Réponse acceptée

Il semble qu'il existe des références circulaires dans votre hiérarchie d'objets qui ne sont pas prises en charge par le sérialiseur JSON. Avez-vous besoin de toutes les colonnes? Vous pouvez sélectionner uniquement les propriétés dont vous avez besoin dans la vue:

return Json(new 
{  
    PropertyINeed1 = data.PropertyINeed1,
    PropertyINeed2 = data.PropertyINeed2
});

Cela rendra votre objet JSON plus léger et plus facile à comprendre. Si vous avez plusieurs propriétés, AutoMapper peut être utilisé pour mapper automatiquement les objets DTO et les objets View.


Réponse d'expert

JSON, comme XML et divers autres formats, est un format de sérialisation basé sur une arborescence. Il ne vous aimera pas si vous avez des références circulaires dans vos objets, comme le serait "l'arbre":

root B => child A => parent B => child A => parent B => ...

Il existe souvent des moyens de désactiver la navigation suivant un certain chemin. Par exemple, avec XmlSerializer vous pouvez marquer la propriété parent comme XmlIgnore . Je ne sais pas si cela est possible avec le sérialiseur json en question, ni si DatabaseColumn a des marqueurs appropriés ( très peu probable, car il faudrait référencer chaque API de sérialisation).



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow