2017-10-28 170 views
0

我找不到比這個教程從窗戶就如何創建一個模型以外的任何文件:https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-apiASP.NET酷睿2的Web API模型

到目前爲止,一切都很好的ASP.NET核心基礎知識,但我的模型比教程中的要複雜一些,我似乎無法在網上找到任何有關我的問題的文檔。

我的模式是這樣的:

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; } 
} 

然後我的控制器看起來是這樣的:

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; 
     } 

    } 
} 

現在,如果我火起來,然後得到了http://localhost:55556/api/workout,我收到一個不完整的JSON看起來像這樣:

[ 
{ 
    "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 

但是當我重新加載頁面時,json現在像thi S:

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

現在,我只是試圖找出辦法有數據之間的關係能夠通過JSON發送完整的Workout對象,而不是JSON與"setList":null或不完整的一個。

謝謝!

+0

你忘了補充一點,您所呼叫 –

+1

您還沒有分配'context'到'在控制器的構造函數_context'的動作,所以這甚至不會工作。請發佈真實代碼 –

+0

我剛剛添加了該操作並編輯了'_context = context;'。當我複製我的代碼時,我忘了它。 @CamiloTerevinto –

回答

0

您的模型有一個循環 - Workout包含一個Exercise的列表,並且每個Exercise包含它所屬的Workout。當序列化程序嘗試將對象格式化爲JSON時,它會檢測到此循環,並放棄並將屬性保留爲null,或者抱怨循環引用。

您可以通過使用JsonIgnore屬性,以防止Exercise.Workout被序列化,或者通過使用DataContractDataMember屬性明確標註哪些字段被序列繞過這一點。您還需要對Set.Exercise執行相同操作。

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

這只是爲我做了詭計!謝謝@ andrew-williamson –