首页 > 解决方案 > 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 数据库列图片

标签: asp.netsql-serverentity-frameworkasp.net-coreasp.net-web-api

解决方案


您可以从 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);

推荐阅读