使用ASP.NET Core中的补丁/发布更新数据库资源

时间:2018-11-01 08:43:16

标签: asp.net entity-framework rest asp.net-core asp.net-core-mvc

我的MVC项目中有2个模型。

任务:

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

Body im通过API发送(使用Postman进行测试):

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

但是我的数据库根本没有更新。所以我的问题是-更新与另一个数据库表(相关对象)相关的一个数据库表的最佳方法是什么,以便更新两个模型(Assigment将获得适当的User,并且该User将有一个新项添加到Assigments集合中)。我也在考虑实现POST方法,但是我不知道哪个版本是最佳的解决方案。谢谢你的协助! :)

2 个答案:

答案 0 :(得分:1)

检查代码中的以下问题:

  • 对于_context.SaveChangesAsync();这是一个异步任务,您需要添加一个wait等待它完成
  • 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);
    }

但是,如果您想通过AssignmentUser添加/更新到特定的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请求

    [
      {
        "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);
    }
    

答案 1 :(得分:0)

请注意,这里遇到的问题与HTTP方法无关-POST,PATCH等都是向外部用户提供有用信息的标准,这些信息是您的API正在执行的操作。它们不会改变您的代码的工作方式。

关于您的问题:

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

要做的第一件事是检查此操作是否实际上是在检索实体。调试代码并检查'assignment'是否为空。

还要检查一下,您是否遇到任何异常?