我的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方法,但是我不知道哪个版本是最佳的解决方案。谢谢你的协助! :)
答案 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);
}
但是,如果您想通过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请求
[
{
"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'是否为空。
还要检查一下,您是否遇到任何异常?