在ASP.NET Core中使用patch/post更新数据库资源



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

和身体im发送通过API(使用Postman测试(:

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

然而,我的数据库根本没有更新。所以我的问题是,更新一个与另一个(相关对象(相关的数据库表的最佳方式是什么,这样两个模型都会得到更新(Assigment会得到合适的User,User会有一个新项目添加到Assigment集合中(。我也在考虑实现POST方法,但我不知道哪个版本是最好的解决方案。谢谢你帮我!:(

检查代码中的以下问题:

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

但是,如果您想通过JsonPatchDocument<Assignment>Assignment添加/更新到特定的User,我建议您尝试将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);
    }
    

提醒一下,您在这里遇到的问题与HTTP方法无关-POST、PATCH等只是向外部用户提供有用信息的标准,API正在执行什么样的操作。它们不会改变代码的工作方式。

关于您的问题:

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

要做的第一件事是检查此操作是否真的在检索实体。调试代码并检查"assignment"是否为null。

此外,只是为了检查一下,您是否遇到任何异常?

最新更新