为什么添加我的待办事项时TodoList的Todos字段没有填写?

时间:2018-11-28 22:07:16

标签: c# asp.net .net api asp.net-core

对于一个学生项目,我必须构建一个.NET-Core 2.1 Todo API。

我的Todo实体:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace TodoApi.Entities
{
    public class Todo
    {
        public int TodoId { get; set; }
        public string Name { get; set; }
        public bool IsComplete { get; set; }        
        public int TodoListId { get; set; }
    }
}

我的ListTodo实体:

using System.Collections.Generic;

namespace TodoApi.Entities
{
    public class TodoList
    {
        public int TodoListId { get; set; }
        public string Name { get; set; }
        public List<Todo> Todos { get; set; }
    }
}

我的TodoController:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using TodoApi.Context;
using TodoApi.Entities;
namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TodoController : ControllerBase
    {
        private readonly TodoContext _context;

        public TodoController(TodoContext context)
        {
            _context = context;
        }

        [HttpPost]
        public IActionResult Create(Todo item)
        {
            var todoList = _context.TodoList.Find(item.TodoListId);
            _context.Todo.Add(item);
            _context.SaveChanges();
            todoList.Todos.Add(item);
            _context.TodoList.Update(todoList);
            _context.SaveChanges();
            return CreatedAtRoute("GetTodo", new { id = item.TodoId }, item);
        }
}

我的ListTodoController:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Authorization;
using TodoApi.Context;
using TodoApi.Entities;

namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TodoListController : ControllerBase
    {
        private readonly TodoContext _context;

        public TodoListController(TodoContext context)
        {
            _context = context;
        }

        [HttpGet]
        public ActionResult<List<TodoList>> GetAll()
        {
            return _context.TodoList.ToList();
        }

        [HttpGet("{id}", Name = "GetTodoList")]
        public ActionResult<TodoList> GetById(int id)
        {
            var item = _context.TodoList.Find(id);
            if (item == null)
            {
                return NotFound();
            }
            return item;
        }

        [HttpPost]
        public IActionResult Create(TodoList item)
        {
            var todos = new List<Todo>();

            item.Todos = todos;

            _context.TodoList.Add(item);
            _context.SaveChanges();

            return CreatedAtRoute("GetTodo", new { id = item.TodoListId }, item);
        }
    }
} 

最后是我的TodoContext:

using Microsoft.EntityFrameworkCore;
using TodoApi.Entities;

namespace TodoApi.Context
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<Todo> Todo { get; set; }
        public DbSet<User> User { get; set; }
        public DbSet<TodoList> TodoList { get; set; }
    }
}

好吧,我将解释这个问题:

  1. 我构建了应用程序->一切正常,没有错误,我的api是可到达的低谷邮递员

  2. 我在POST TodoList端点上发布了一个新的干净TodoList

请求正文json有效载荷:

{
    "name": "TodoList Name",
    "isComplete": false,
} 

Api身体响应:

{
    "todoListId": 1,
    "name": "TodoList Name",
    "todos": []
} 
  1. 我在Todo端点上发布了一个具有先前todoListId:1的新Todo

请求正文json有效载荷:

{
    "name": "Todo Name",
    "isComplete": false,
    "todoListId": 1
} 

Api身体响应:

{
    "todoId": 1,
    "name": "Todo Name",
    "isComplete": false,
    "todoListId": 1
}
  1. 最后是我的问题...现在,我尝试在GET / id TodoList端点上获取我的TodoList

Api身体响应:

{
    "todoListId": 1,
    "name": "TodoList Name",
    "todos": null
} 

我不明白我在做什么错,为什么“ todos”字段值现在为null?

1 个答案:

答案 0 :(得分:0)

感谢@Kirk Larkin和@Hubert Jarema:

我的ListTodo Controller GET / id端点的正确代码:

[HttpGet("{id}", Name = "GetTodoList")]
public ActionResult<TodoList> GetById(int id)
{
    var item = _context.TodoList.Find(id);
    _context.TodoList.Include(x => x.Todos).ToList();
    if (item == null)
    {
        return NotFound();
    }
    return item;
}