L'auto référencement boucle détecté - récupérer des données à partir de WebApi pour le navigateur
Je suis en utilisant Entity Framework et ayant un problème avec l'obtention de parent et de l'enfant données dans le navigateur. Voici mes classes:
public class Question
{
public int QuestionId { get; set; }
public string Title { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int AnswerId { get; set; }
public string Text { get; set; }
public int QuestionId { get; set; }
public virtual Question Question { get; set; }
}
J'utilise le code suivant pour retourner la question et la réponse de données:
public IList<Question> GetQuestions(int subTopicId, int questionStatusId)
{
var questions = _questionsRepository.GetAll()
.Where(a => a.SubTopicId == subTopicId &&
(questionStatusId == 99 ||
a.QuestionStatusId == questionStatusId))
.Include(a => a.Answers)
.ToList();
return questions;
}
Sur le C#, côté cela semble fonctionner, cependant je remarque que la réponse objets ont des références de la question. Lorsque j'utilise la WebAPI pour obtenir les données dans le navigateur j'obtiens le message suivant:
Le "ObjectContent`1' type échoué à sérialiser le corps de la réponse pour le type de contenu application/json; charset=utf-8'.
Auto référencement boucle détecté pour les biens à la "question", avec le " type de Modèles.De base.Question".
Est-ce parce que la Question n'a de Réponses et les Réponses ont un renvoi à la Question? Tous les endroits que j'ai regardé vous suggérons de faire une référence à la mère de l'enfant donc je ne sais pas quoi faire. Quelqu'un peut-il me donner quelques conseils sur ce.
- Utilisation Dto pour votre site web api, en évitant le retour de l'Entité, directement dans votre reaponse
- Qu'est-ce que Dto? L'ensemble de notre application utilise EF, nous sommes en utilisant AngularJS sur le client, et nous n'avons pas de problèmes autres que pour ce seul cas.
- Ce que je voulais dire, vous devez définir votre Dto pour votre site Web Api, Dto est une sorte de semblable avec ViewModel dans MVC. Dto est comme un wrapper o votre modèle EF de fournir des données de votre client (angularjs).
- double possible de JSON.NET Erreur de l'Auto référencement boucle détecté pour le type
- Vous pourriez avoir un coup d'oeil à ma réponse concernant “l'Auto Référencement Boucle de détection d'exception avec JSON.Net de la page.
Vous devez vous connecter pour publier un commentaire.
Oui. Il ne peut pas être sérialisé.
EDIT: Voir Tallmaris de réponse et d'OttO commentaire car il est plus simple et peut être défini à l'échelle mondiale.
Vieille Réponse:
Projet de l'EF objet
Question
à votre propre intermédiaire ou DataTransferObject. Cette Dto peut alors être sérialisé avec succès.Quelque chose comme:
Vous pouvez aussi essayer ceci dans votre
Application_Start()
:Il devrait résoudre votre problème sans passer par de nombreux cercles.
EDIT: Comme par OttO commentaire ci-dessous, utilisez:
ReferenceLoopHandling.Ignore
à la place.Create()
méthode qui accepte un paramètre en tant que paramètre. Docs: newtonsoft.com/json/help/html/...Si vous utilisez OWIN, rappelez-vous, pas plus GlobalSettings pour vous! Vous devez modifier ce paramètre même dans un HttpConfiguration objet qui est transmis à la IAppBuilder UseWebApi fonction (ou quelle que soit la plate-forme de service, vous êtes sur)
Ressemblerait à quelque chose comme ça.
Dans ASP.NET le Noyau de la fix est comme suit:
Si à l'aide de modèles DNX /MVC 6 /ASP.NET vNext bla bla, même
HttpConfiguration
est manquant. Vous devez config formateurs en utilisant les codes suivants dans votreStartup.cs
fichier.ASP.NET Web de Base de l'API (.NET Core 2.0):
En utilisant ceci:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
ne fonctionne pas pour moi. Au lieu de cela j'ai créé une nouvelle, version simplifiée de mon modèle de classe juste pour tester, et qui est revenu très bien. Cet article revient sur quelques-uns des problèmes que je vivais dans mon modèle qui a très bien fonctionné pour l'EF, mais n'étaient pas sérialisable:
http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-4
ReferenceLoopHandling.L'ignorer ne fonctionne pas pour moi. La seule façon que je pouvais aller faire un tour, il était de supprimer via le code des liens de retour pour le parent que je ne voulais pas et de garder ceux que j'ai fait.
Pour une nouvelle Asp.Net Application Web à l'aide .Net Framework 4.5:
Api Web: Goto App_Start -> WebApiConfig.cs:
Devrait ressembler à quelque chose comme ceci:
En raison de lazy loading vous obtenez cette erreur. Donc, ma suggestion est de supprimer la clé virtuelle de la propriété. Si vous travaillez avec de l'API puis du chargement différé n'est pas bon pour votre API de santé.
Pas nécessaire d'ajouter une ligne supplémentaire dans votre fichier de configuration.
J'ai trouvé cette erreur a été causé quand j'ai généré un edmx (fichier XML qui définit un modèle conceptuel), d'une base de données existante et il avait les propriétés de Navigation à la fois les tables parent et enfant. J'ai supprimé tous les liens de navigation pour les objets parents, car je ne voulais accéder à des enfants, et le problème a été résolu.
Entités db = new Entités()
db.La Configuration.ProxyCreationEnabled = false;
db.La Configuration.LazyLoadingEnabled = false;
Vous pouvez créer dynamiquement un nouvel enfant de la collection de facilement contourner ce problème.
Aucune des configurations dans les réponses ci-dessus a travaillé pour moi dans ASP.NET Core 2.2.
J'ai eu l'ajouter les
JsonIgnore
attributs sur mon virtuel propriétés de navigation.