J'ai eu ce problème et l'ai résolu en ajoutant le Newtonsoft.Json.JsonIgnoreAttribute à la propriété provoquant la boucle. Évidemment, cette propriété ne sera pas sérialisée. Pour résoudre ce problème, j'ai généralement l'ID de référence étranger et la classe étrangère dans mes entités. Je me rends compte que ce n'est pas intuitif (ou super grand OO), mais c'est la manière recommandée par Julia Lerman dans son livre Programming Entity Framework: Code First. J'ai trouvé qu'il aide à aplanir plusieurs problèmes avec Entity Framework.
public class SomeEntity
{
[JsonIgnore]
public ForeignEntity SomeForeignEntity {get;set;}
public Guid ForeignEntityId {get;set;}
}
Mise à jour: j'ai oublié de mentionner que je devais aussi désactiver les procurations sur le DbContext comme ceci:
dataContext.Configuration.ProxyCreationEnabled = false;
Si vous écrivez le code pour un service (ce qui semble probable si vous sérialisation) , alors ce n'est probablement pas un problème, mais il y a des choses que vous perdez quand 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 le MS Web Api, donc je désactiver simplement la création de 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;
}
....
Merci pour votre réponse. Je ne voulais pas éliminer les références cycliques dans le graphe d'objets car je ne suis pas tout à fait sûr de savoir comment le faire et quelles seraient les implications de ce changement. Au lieu de cela, j'ai créé des objets simples simples et peuplé ces objets en utilisant des objets Entity Framework, puis en sérialisant les objets simples et cela fonctionne bien. – Hitesh
D'une manière générale, c'est une bonne pratique de garder vos entités de domaine et vos DTO indépendants les uns des autres. Les entités dans leur état natif, riche et graphique constituent un excellent moyen de modéliser un domaine de problème métier et de résoudre des problèmes métier, mais elles ne se prêtent pas bien à l'orientation-service et à la sérialisation. Ma préférence personnelle est de garder mon domaine aussi riche et interrelié que possible afin qu'il modélise l'entreprise et fournisse des API de service indépendantes qui fournissent des DTO sérialisables individuels. – jrista
Ce problème est plus important que les cycles dans les références provoquées par les propriétés de navigation bidirectionnelles. Qu'en est-il lorsque vous avez 10 objets qui référencent tous exactement le même objet dépendant? Quelle est la manière standard de sérialiser ce graphique sans dupliquer l'objet référencé 10 fois? Et par ce même jeton désérialisant correctement les données du côté client, en recréant une seule instance de l'objet référencé au lieu de 10 différentes? Des normes ou des modèles communs pour cela en utilisant JSON? – Marchy