2017-10-28 4 views
0

ich keine Unterlagen außer diesem Tutorial von Fenstern, wie ein Modell zu erstellen, finden Sie unter: https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-apiASP.NET Core 2 Web-API-Modelle

Bisher ist alles gut für ASP.NET Kern Grundlagen, aber meine Modelle sind ein bisschen komplexer als der im Tutorial und ich kann nicht scheinen, irgendein Doc online für mein Problem zu finden.

Meine Modelle wie folgt aussieht:

public class Set 
{ 
    public int Id { get; set; } 
    public byte Rep { get; set; } 
    public int Weight { get; set; } 
    public int NumberOfDS { get; set; } 
    public double PercentDrop { get; set; } 
    public virtual Exercise Exercise { get; set; } 
    public int ExerciseId { get; set; } 
} 

public class Exercise 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Set> SetList { get; set; } 
    public byte RestTime { get; set; } 
    public virtual Workout Workout { get; set; } 
    public int WorkoutId { get; set; } 
} 

public class Workout 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Exercise> ExerciseList { get; set; } 
    public bool Archived { get; set; } 
} 

Dann mein Controller wie folgt aussieht:

namespace WorkoutKeeper.Core.Controllers 
{ 
    [Route("api/[controller]")] 
    public class WorkoutController : Controller 
    { 
     public readonly ApiContext _context; 

     public WorkoutController(ApiContext context) 
     { 

      _context = context; 

      if (_context.WorkoutItems.Count()==0) 
      { 
       Workout wo1 = new Workout() { Name = "WO1" }; 
       _context.WorkoutItems.Add(wo1); 
       _context.SaveChanges(); 

       Exercise e1 = new Exercise() { Name = "E1", WorkoutId = wo1.Id }; 
       _context.ExerciseItems.Add(e1); 
       _context.SaveChanges(); 

       Set s1 = new Set() { Rep = 10, Weight = 50, ExerciseId = e1.Id }; 
       _context.SetItems.Add(s1); 
       _context.SaveChanges(); 
      } 
     } 

     [HttpGet] 
     public IEnumerable<Workout> GetAll() 
     { 
      return _context.WorkoutItems; 
     } 

    } 
} 

Nun, wenn ich es stand auf Feuer dann http://localhost:55556/api/workout, erhalte ich eine unvollständige json die aussieht wie folgt:

[ 
{ 
    "id":1, 
    "name":"WO1", 
    "description":null, 
    "exerciseList": 
    [ 
    { 
    "id":1, 
    "name":"E1", 
    "description":null, 
    "setList": 
     [ 
     { 
     "id":1, 
     "rep":10, 
     "weight":50, 
     "numberOfDS":0, 
     "percentDrop":0.0 

aber wenn ich die Seite neu lade, ist der JSON jetzt wie thi s:

[{ 
    "id":1, 
    "name":"WO1", 
    "description":null, 
    "exerciseList":null, 
    "archived":false 
}] 

Nun, ich versuche nur einen Weg, um herauszufinden, eine Beziehung zwischen den Daten zu haben, um ein komplettes Workout Objekt von json zu senden anstelle des json mit "setList":null oder unvollständig ein.

Danke!

+0

Sie haben vergessen, die Aktion hinzufügen, die Sie –

+1

Sie rufen auch nicht 'context' zu' _context' in Ihrem Controller Konstruktor zuweisen, so dass diese nicht einmal funktionieren würde. Bitte poste den echten Code –

+0

Ich habe gerade die Aktion hinzugefügt und den '_context = context;' editiert. Ich habe es nur vergessen, als ich meinen Code kopiert habe, sorry. @CamiloTerevinto –

Antwort

0

Ihre Modelle haben eine Schleife - Workout enthält eine Liste von Exercise, und jede Exercise enthält die Workout gehört zu. Wenn der Serializer versucht, Ihre Objekte als JSON zu formatieren, erkennt er diese Schleife und gibt entweder die Eigenschaft null auf oder belässt die Eigenschaft oder klagt über Zirkelreferenzierung.

Sie können dies umgehen, indem das JsonIgnore Attribut zu verhindern Exercise.Workout von serialisierten ist, oder durch die Verwendung DataContract und DataMember Attribute explizit markieren, welche Felder sollte serialisiert werden. Sie müssen das gleiche für Set.Exercise tun.

public class Exercise 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<Set> SetList { get; set; } 
    public byte RestTime { get; set; } 
    [JsonIgnore] 
    public virtual Workout Workout { get; set; } 
    public int WorkoutId { get; set; } 
} 

public class Set 
{ 
    public int Id { get; set; } 
    public byte Rep { get; set; } 
    public int Weight { get; set; } 
    public int NumberOfDS { get; set; } 
    public double PercentDrop { get; set; } 
    [JsonIgnore] 
    public virtual Exercise Exercise { get; set; } 
    public int ExerciseId { get; set; } 
} 
+0

Das hat nur den Trick für mich! Danke @ andrew-williamson –