ASP. Net Core - Как получить отношение внешнего ключа, работающее над POST-запросом для web-api? - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю простой список задач API, используя ASP. Net Core. Он имеет две основные две основные модели: модель списка и модель задачи. Каждый список имеет много задач. Я строю модели следующим образом:

Список моделей:

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;
        }
    }
}

Когда Я отправляю запрос на публикацию для создания новой задачи. Я пытаюсь добавить созданную задачу в часть Icollection модели List.

Мой контроллер выглядит следующим образом:

// 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, кроме списка вложенный имеет значение null.

Также задача не добавляется в список. Коллекция задач.

{"listId":11,"title":"Learn ASP.Net Core","colour":"secondary","tasks":[]}

Как видите, задачи все еще пусты.

Как сделать Я установил, что когда создается задача, она всегда добавляется в List.Tasks, а затем к Tasks.List добавляется правильный список, а не NULL.

Также в моей SQL Sever Database Я ожидал увидеть Задачи в таблице списков, но не вижу. Кто-нибудь может объяснить, почему? SQL Разрезать столбцы базы данных Рисунок

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете загрузить объект List из вашего DbContext и добавить его к возвращаемому вами объекту 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);
...