【问题标题】:ASP.Net Core - How to get foreign key relation working on POST request for a web-api?ASP.Net Core - 如何让外键关系处理 web-api 的 POST 请求?
【发布时间】:2020-07-20 20:14:25
【问题描述】:

我正在使用 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 表中看到一个 Tasks,但我没有。谁能解释为什么? SQL Sever Database Columns Picture

【问题讨论】:

    标签: asp.net sql-server entity-framework asp.net-core asp.net-web-api


    【解决方案1】:

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

    【讨论】:

    • 好的,我想我得到了一些地方,但现在我得到了一个对象周期异常“JsonException:检测到一个可能的对象周期,它不受支持。这可能是由于一个周期,或者如果对象深度大于最大允许深度 32。”有修复的想法吗?
    • 我已经通过关注这个线程stackoverflow.com/questions/59199593/…解决了循环问题
    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多