1

J'ai les deux classes suivantes dans une application C# ASP.Net Entity Framework configuration par codeContrôleur d'API EF C# ne chargeant pas beaucoup de cartes

Classe d'installation;

public class Facility 
{ 
    public int Id { get; set; } 
    public string Name {get; set; } 
    public ICollection<SubscriberList> SubscriberLists {get; set;} 
} 

SubscriberList Classe;

Public class SubscriberList 
{ 
    public SubscriberList() 
    { 
     Facilities = new HashSet<Facility>(); //not sure if I need this. 
    } 
    public int Id { get; set; } 
    public int ClientId { get; set; } 
    public ICollection<Facility> Facilities { get; set; } 
} 

Avec la configuration suivante;

public class SubscriberListConfiguration : EntityTypeConfiguration<SubscriberList> 
{ 
    public SubscriberListConfiguration() 
    { 
     HasMany(w => w.Facilities) 
      .WithMany(s => s.SubscriberLists) 
      .Map(m => 
      { 
       m.ToTable("SubscriberListFacilities"); 
       m.MapLeftKey("SubscriberListId"); 
       m.MapRightKey("FacilityId"); 
      }); 
    } 
} 

Maintenant, j'ai le ApiController suivant

public List<SubscriberList> GetSubscriberLists() 
{ 
    var list = _context.SubscriberLists 
     .Include(c => c.Facilities) 
     .ToList(); 
    return list; 
} 

Lorsque vous appelez la demande Get au/api/SubscriberLists Je reçois le texte suivant JSON qui manque le "nom de l'installation"

[ 
    { 
     "Id": 2, 
     "ClientId": 1000001, 
     "Facilities": [ 
      { 
       "$id": "1" 
      } 
     ] 
    }, 
    { 
     "Id": 3, 
     "ClientId": 1000002, 
     "Facilities": [ 
      { 
       "$id": "2" 
      }, 
      { 
       "$id": "3" 
      } 
     ] 
    } 
] 

Comme vous pouvez le voir, il ne renvoie pas le Facility.Name, seul le Facility.Id. J'ai essayé en ajoutant le mot-clé virtual avant ICollection. Essayé de changer ICollection<> à IList<> ainsi qu'à List<> Également essayé d'ajouter l'attribut [JsonProperty("Facilities")] au-dessus du champ Facilities. Également essayé d'itérer la liste renvoyée interrogeant les installations pour déclencher le chargement. Rien n'a aidé jusqu'à présent.

La chose intéressante est que dans le mode de débogage, je peux voir tout chargé comme prévu, je vois tous les champs Facility.Name peuplés. Je crains que le problème ici se trouve au Json Serializer, mais je n'ai aucune idée de comment résoudre ce problème.

Quelle est ma prochaine étape?

Merci à l'avance

Modifier;

À ajouter. Lorsque vous naviguez vers l'URL Api dans le navigateur, ce qui entraîne l'obtention de données XML au lieu de JSON, j'obtiens le résultat suivant dans le tableau Facilities.

<Facilities> 
    <Facility xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="i1"/> 
</Facilities> 
+1

Êtes-vous sûr que l'installation avec ID 4 a autre nom puis 'null' dans votre DB? –

+0

@VadimMartynov Oui, le Facility Id 4 (maintenant 2) a un nom, mais c'est encore plus étrange, que les numéros $ id qu'il renvoie ne proviennent pas réellement de la base de données, il incrémente juste pour chaque instance dans les données retournées. (J'ai omis quelques réponses pour plus de simplicité, je l'ai maintenant mis à jour à 1,2 et 3) –

+1

Cela ressemble au résultat du sérialiseur JSON ['ReferenceLoopHandling'] (http://www.newtonsoft.com/json/help/ html/SerializationSettings.htm) défini sur 'Ignorer'. Avez-vous des problèmes de désérialisation de JSON? –

Répondre

1

Je pense que votre carte est un peu loin, peut-être essayer ce

modelBuilder.Entity<Facility>() 
.HasMany<SubscriberList>(s => s.Facilities) 
.WithMany(c => c.SubscriberLists) 
.Map(cs => 
{ 
    cs.MapLeftKey("FacilityId"); 
    cs.MapRightKey("SubscriberListId"); 
    cs.ToTable("SubscriberListFacilities"); 
}); 

Configure Many-to-Many relationship

+0

Je ne suis pas vraiment sûr de ce que vous avez ajouté dans votre réponse. La seule chose que je vois est que vous avez commencé la configuration avec le Facility pendant que j'ai démarré la configuration avec le SubscribeList. (Dans une relation plusieurs à plusieurs, il n'y a aucune différence sur la classe dans laquelle vous effectuez la configuration) J'ai mis à jour la question pour inclure l'ensemble de la classe de configuration afin que vous obteniez l'image complète. Dites-moi si vous voyez encore que j'ai raté quelque chose dans votre réponse. Merci. –

+0

Plus. Je ne pense pas que le problème soit dans ma cartographie. La base de données ressemble exactement comme prévu, et j'ai les bons résultats avec le contrôleur MVC régulier, et je vois les données correctes en mode débogage lors de l'inspection locale. Le seul problème ici est quand il s'agit d'obtenir les données via le contrôleur "API". –

+0

Je vois, il pourrait y avoir un problème avec include dans votre cas. http://stackoverflow.com/questions/28055327/entity-framework-include-is-not-working-within-complex-query. – Nonik