Sérialiser les objets Entity Framework dans JSON

asp.net-ajax entity-framework json wcf

Question

Il semble que la sérialisation des objets Entity Framework dans JSON n'est pas possible à l'aide du DataContractJsonSerializer natif de WCF ou du sérialiseur JavaScript natif d'ASP.NET. Cela est dû aux problèmes de comptage de références rejetés par les sérialiseurs. J'ai également essayé Json.NET , qui échoue également spécifiquement sur un problème de comptage de références.


Edit: Json.NET peut maintenant sérialiser et désérialiser les entités Entity Framework .


Mes objets sont des objets Entity Framework, surchargés pour permettre l’utilisation de fonctionnalités commerciales supplémentaires (par exemple, une authentification, etc.) et je ne souhaite pas décorer ces classes avec des attributs propres à la plate-forme, etc., car je souhaite présenter une API indépendante de la plate-forme. .

En fait, j'ai blogué sur les étapes que j'ai suivies à l' adresse https://blog.programx.co.uk/2009/03/18/wcf-json-serialization-woes-and-a-solution/.

Ai-je oublié quelque chose d'évident?

Réponse acceptée

Pour ce faire, je projette les données que je veux sérialiser dans un type anonyme et les sérialise. Cela garantit que seules les informations que je veux réellement dans le JSON sont sérialisées et que je ne sérialise pas par inadvertance quelque chose plus en aval du graphe d'objets. Cela ressemble à ceci:

var records = from entity in context.Entities
              select new 
              {
                  Prop1 = entity.Prop1,
                  Prop2 = entity.Prop2,
                  ChildProp = entity.Child.Prop
              }
return Json(records);

Je trouve les types anonymes presque parfaits pour cela. Le JSON, évidemment, se moque du type utilisé pour le produire. Et les types anonymes vous offrent une flexibilité totale quant aux propriétés et à la structure que vous avez définies dans le JSON.


Réponse populaire

Microsoft a commis une erreur dans la manière dont les objets EF ont été transformés en contrats de données. Ils comprenaient les classes de base et les liens arrières.

Votre meilleur choix sera de créer des classes d'objets de transfert de données équivalentes pour chacune des entités que vous souhaitez renvoyer. Celles-ci n'incluent que les données, pas le comportement, ni les parties d'une entité spécifiques à EF. Vous créeriez également des méthodes pour traduire vers et à partir de vos classes DTO.

Vos services renverraient alors les objets de transfert de données.



Related

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