asp.net - ASP.Net Core - 如何让外键关系处理 web-api 的 POST 请求?
问题描述
我正在使用 ASP.Net Core 构建一个简单的待办事项列表 api。它有两个主要的两个主要模型,一个列表模型和一个任务模型。每个列表都有许多任务。我建立这样的模型:
列表型号:
namespace ToDoList.Models
{
public class List
{
[Key]
public int ListId { get; set; }
[Required]
[StringLength(25)]
public string Title { get; set; }
public string Colour { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
public List()
{
Tasks = new List<Task>();
Colour = "secondary";
}
}
}
任务模型:
namespace ToDoList.Models
{
public class Task
{
[Key]
public int TaskId { get; set; }
[Required]
[StringLength(50)]
public string Title { get; set; }
public bool Done { get; set; }
public int ListId { get; set; }
public virtual List List { get; set; }
public Task()
{
Done = false;
}
}
}
当我发送发布请求以创建新任务时,我正在努力将创建的任务添加到 List 模型的 Icollection 部分。
我的控制器看起来像这样:
// POST: api/Tasks
[HttpPost]
public async Task<ActionResult<Models.Task>> PostTask(Models.Task task)
{
_context.Tasks.Add(task);
await _context.SaveChangesAsync();
return CreatedAtAction("GetTask", new { id = task.TaskId }, task);
}
如果我将此数据作为 JSON 作为 POST 请求发送:
{ title: "A New Task", listId: 11 }
我创建了这个任务:
{"taskId":16,"title":"A New Task","done":false,"listId":11,"list":null}
如您所见,它具有正确的 listId,但附加的列表为空。
该任务也不会添加到 list.Tasks 集合中。
{"listId":11,"title":"Learn ASP.Net Core","colour":"secondary","tasks":[]}
如您所见,任务仍然是空的。
我如何设置它,每当创建任务时,它总是添加到 List.Tasks,然后 Tasks.List 附加了正确的列表,而不是 null。
同样在我的 SQL Sever 数据库上,我希望在 Lists 表中看到一个任务,但我没有。谁能解释为什么? SQL Server 数据库列图片
解决方案
您可以从 DbContext 加载 List 实体并将其添加到您返回的 Task 对象中:
[HttpPost]
public async Task<ActionResult<Models.Task>> PostTask(Models.Task task)
{
_context.Tasks.Add(task);
await _context.SaveChangesAsync();
task.List = _context.Lists.Single(task.ListId);
return CreatedAtAction("GetTask", new { id = task.TaskId }, task);
}
或者您可以返回从包含列表的 DbContext 加载的任务的实例:
var taskFromDb = _context.Tasks.Include(x => x.List).Single(x => x.Id = task.Id);
return CreatedAtAction("GetTask", new { id = task.TaskId }, taskFromDb);
要获取包含任务的列表,需要从 DbContext 加载它:
var listWithTasks = _context.Lists.Include(x => x.Tasks).Single(x => x.Id == task.ListId);
推荐阅读
- python - 如何在两列时间对象之间建立差异?
- regex - 为什么以通配符 * 开头的 git pathspec 在子目录中不匹配?
- ruby-on-rails - 共享同一个模型名的单表继承:如何翻译派生类的模型名?
- python - 无法找到某些尽管他们的存在
- google-chrome - 熔断骆驼上下文hawtio在Chrome中不刷新
- redis - Spring“Redis 字符串模板”附加值而不是替换
- azure-devops - 从 Azure CLI 作业发布测试结果
- node.js - 函数调用第一次没有返回值
- c# - 如何获得在没有 WMI 的远程计算机上运行的进程的所有者
- django - Django-Q 设置 Q_CLUSTER 'sync': True 不适用于单元测试