Обновление базы данных с использованием патча / поста в ASP.NET Core - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть 2 модели в моем проекте MVC.

Назначение:

public class Assignment
{
        public int ID { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public User User { get; set; }
}

Пользователь:

public class User
{
        public int ID { get; set; }

        public string Name { get; set; }

        public ICollection<Assignment> Assignments { get; set; }
}

Между ними существует отношение "многие к одному". Один пользователь может иметь несколько назначений. В настоящее время я работаю над контроллером API и хочу реализовать метод обновления для назначения, которое будет добавлено для конкретного пользователя.

То, что я до сих пор узнал, это попробовать метод PATCH. Вот мой блок кода, который не работает так, как я хочу.

        [HttpPatch]
        [Route("api/[controller]/{id}")]
        public IActionResult DelegateAssignment(int id, [FromBody]JsonPatchDocument<Assignment> assignmentPatch)
        {
            var assignment = _context.Assignments.Find(id);
            assignmentPatch.ApplyTo(assignment);
            _context.SaveChangesAsync();

            return Ok(assignment);
        }

А тело отправляю через API (тестирование с помощью Почтальона):

 [
    {
      "op": "replace",
      "path": "/User",
      "value": {
        "id": 1,
        "name": "User1"
      }
    }
]

Однако моя база данных вообще не обновляется. Поэтому мой вопрос - каков наилучший способ обновления одной таблицы базы данных, связанной с другой (связанными объектами), чтобы обе модели были обновлены (задание получит надлежащего пользователя, а у пользователя будет добавлен новый элемент в коллекцию назначений). Я также думал о реализации метода POST, но я не знаю, какая версия будет лучшей в качестве решения. Спасибо за помощь мне! :)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Проверьте перечисленные ниже проблемы в своем коде:

  • Для _context.SaveChangesAsync();, которая является асинхронной задачей, вам нужно добавить await, чтобы дождаться ее завершения
  • Измените IActionResult на async Task<IActionResult>, чтобы использовать await _context.SaveChangesAsync();.

Я работаю над контроллером API и хочу реализовать обновление метод для назначения, который будет добавлен для конкретного пользователя.

Если вы работаете с кодом, попробуйте

        public async Task<IActionResult> DelegateAssignment(int id, [FromBody]JsonPatchDocument<Assignment> assignmentPatch)
    {
        //Option1
        var assignment = _dbContext.Assignment.Include(a => a.User).AsNoTracking().FirstOrDefault(a => a.ID == id);
        assignmentPatch.ApplyTo(assignment);
        _dbContext.Assignment.Update(assignment);
        return Ok(assignment);
    }

Но, если вы хотите добавить / обновить Assignment до определенного User на JsonPatchDocument<Assignment>, я предлагаю вам попробовать добавить свойство UserID в Assignment, а затем изменить UserID вместо User.

  • Назначение

    public class Assignment
    {
       public int ID { get; set; }
    
       public string Name { get; set; }
    
       public string Description { get; set; }
    
       public int UserID { get; set; }
    
       public User User { get; set; }
    }
    
  • Json Request

    [
      {
        "op": "replace",
        "path": "/UserID",
        "value": 1
      }
    ]
    
  • Контроллер

        public async Task<IActionResult> DelegateAssignment(int id, [FromBody]JsonPatchDocument<Assignment> assignmentPatch)
    {          
    
        //Option2
        var assignment = _dbContext.Assignment.Find(id);
        assignmentPatch.ApplyTo(assignment);
    
        await _dbContext.SaveChangesAsync();
    
        return Ok(assignment);
    }
    
0 голосов
/ 01 ноября 2018

Просто напоследок, проблема, с которой вы здесь сталкиваетесь, не имеет ничего общего с методом HTTP - POST, PATCH и т. Д. - это просто стандарты, которые предоставляют полезную информацию внешним пользователям о том, какие операции выполняет ваш API. Они не меняют способ работы вашего кода.

Относительно вашей проблемы:

var assignment = _context.Assignments.Find(id);

Первое, что нужно сделать, это проверить, действительно ли эта операция извлекает сущность. Отладьте ваш код и проверьте, является ли «назначение» пустым или нет.

Кроме того, просто чтобы проверить, встречаетесь ли вы с какими-либо исключениями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...