Почему поле Todos моего TodoList не заполняется при добавлении Todo? - PullRequest
0 голосов
/ 29 ноября 2018

Для студенческого проекта мне нужно создать .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. Я публикую новый чистый TodoList на конечной точке POST TodoList

Тело запроса json Полезная нагрузка:

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

Ответ Body Api:

{
    "todoListId": 1,
    "name": "TodoList Name",
    "todos": []
} 
Я публикую новый Todo с предыдущим todoListId: 1 на конечной точке Todo

Запрос тела json Полезная нагрузка:

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

Ответ Body Api:

{
    "todoId": 1,
    "name": "Todo Name",
    "isComplete": false,
    "todoListId": 1
}
Наконец-то моя проблема ... Теперь я пытаюсь получить свой TodoList на конечной точке GET / id TodoList

Ответ Body Api:

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

Не знаюЯ не понимаю, что я делаю неправильно, почему значение поля "todos" теперь равно нулю?

1 Ответ

0 голосов
/ 29 ноября 2018

Спасибо @Kirk Larkin и @Hubert Jarema:

Правильный код для моей конечной точки GET / id контроллера ListTodo:

[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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...