2017-10-28 43 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 –