Sérialiser un objet Entity Framework à l'aide de Json.Net

asp.net-mvc entity-framework javascript json.net

Question

Comment sérialiser un objet de structure d'entité en objet JavaScript (JSON)? J'ai essayé d'utiliser JSON.NET, mais je reçois l'exception suivante lorsque j'essaie de le sérialiser.

Exception: Newtonsoft.Json.JsonSerializationException, Message = "Boucle de référence automatique"

Hitesh

Réponse acceptée

Il semble que vous rencontriez le même problème général que le sérialiseur DataContract d'origine, en ce qui concerne les références cycliques. Alors que les objets se référant sont assez communs avec les graphiques d’objets en mémoire, de telles références cycliques entraînent inévitablement des récursions infinies lorsqu’elles sont sérialisées si le sérialiseur ne les prend pas en compte spécifiquement. Il existe peu ou pas de normes établies pour traiter les références cycliques dans les formats de sérialisation non binaires courants (XML et JSON étant les deux systèmes les plus répandus).

Microsoft a résolu le problème cyclique du sérialiseur DataContract dans .NET 3.5 SP1 en utilisant la sémantique ref de XML. À ma connaissance, JSON n'existe pas, ce qui pourrait expliquer pourquoi JSON.NET vous empêche de sérialiser votre graphe d'objets.

Je voudrais m'assurer que votre graphe d'objets ne contient que des références qui sont navigables dans un sens, plutôt que dans les deux sens (c'est-à-dire uniquement d'un parent à l'autre et non d'un enfant à l'autre). types de références cycliques. Il se peut également qu’un enfant de niveau inférieur fasse en fin de compte référence à la racine du graphe, ce qui entraîne la création d’un graphe cyclique indirect (elles tendent cependant à être beaucoup moins courantes que les boucles parent / enfant).

Une fois que vous avez éliminé toutes les références cycliques dans votre graphe d'objets, vous devriez pouvoir sérialiser.


Réponse populaire

J'ai eu ce problème et l'a résolu en ajoutant le Newtonsoft.Json.JsonIgnoreAttribute à la propriété provoquant la boucle. De toute évidence, cette propriété ne sera pas sérialisée. Pour résoudre ce problème, j'ai généralement à la fois l'ID de référence étrangère et la classe étrangère dans mes entités. Je réalise que ce n’est pas intuitif (ni super génial, mais c’est ce que recommande Julia Lerman dans son livre Programming Entity Framework: Code First. J'ai trouvé que cela permettait de résoudre plusieurs problèmes liés à Entity Framework.

 public class SomeEntity
 {
      [JsonIgnore]
      public ForeignEntity SomeForeignEntity {get;set;}
      public Guid ForeignEntityId {get;set;}
 }

Mise à jour: j'ai oublié de mentionner que j'avais également besoin de désactiver les serveurs proxy sur le DbContext, comme ceci:

dataContext.Configuration.ProxyCreationEnabled = false;

Si vous écrivez le code d'un service (ce qui semble probable si vous sérialisez), alors ce n'est probablement pas un problème, mais vous perdez certains éléments lorsque la création de proxy est désactivée. Voir ici: http://www.sellsbrothers.com/posts/Details/12665 pour plus de détails.

J'utilise MS Web Api, alors je désactive simplement la création du proxy lorsque je construis mon contrôleur:

public class MailingApiController : ApiController
{
    public MailingApiController()
    {
        PreventDeepSerialization();
    }

    private static void PreventDeepSerialization()
    {
        var dataContext = Injector.Get<IIntertwyneDbContext>();
        dataContext.Configuration.ProxyCreationEnabled = false;
    }
      ....


Related

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