我的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。
此外,只是为了检查一下,您是否遇到任何异常?