对于一个学生项目,我必须构建一个.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; }
}
}
好吧,我将解释这个问题:
我构建了应用程序->一切正常,没有错误,我的api是可到达的低谷邮递员
我在POST TodoList端点上发布了一个新的干净TodoList
请求正文json有效载荷:
{
"name": "TodoList Name",
"isComplete": false,
}
Api身体响应:
{
"todoListId": 1,
"name": "TodoList Name",
"todos": []
}
请求正文json有效载荷:
{
"name": "Todo Name",
"isComplete": false,
"todoListId": 1
}
Api身体响应:
{
"todoId": 1,
"name": "Todo Name",
"isComplete": false,
"todoListId": 1
}
Api身体响应:
{
"todoListId": 1,
"name": "TodoList Name",
"todos": null
}
我不明白我在做什么错,为什么“ todos”字段值现在为null?
答案 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;
}