c# - 修补相关数据 ASP.NET Core Web API
问题描述
我有一Job
堂有很多JobBudgetItem
s的课。我正在使用 Microsoft 的内置 JsonPatch 库在控制器上实现 PATCH 方法。我遇到的问题是,当我尝试更新 a 中的字段时JobBudgetItem
,EF Core 不会保留更改。JobBudgetItem
相反,它会创建具有不同 ID的每个现有的副本。
工作
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<JobBudgetItem> JobBudgetItems { get; set; }
工作预算项目
public int Id { get; set; }
public string Category { get; set; }
public int JobId { get; set; }
public Job job { get; set; }
获取/工作/1
{
"id": 1,
"name": "Test",
"jobBudgetItems": [
{
"id": 1,
"category": "ATestCategory",
},
{
"id": 12,
"category": "BTestCategory",
}
]
}
补丁/工作/1
[{
"op": "replace", "path": "/jobBudgetItems/0/category", "value": "CTestCategory"
}]
工作控制器
[HttpPatch("{id}")]
public async Task<IActionResult> PartiallyUpdateJob(int id, [FromBody] JsonPatchDocument<JobDTO> patchJob)
{
var jobFromRepo = await _jobManager.GetJobAsync(id);
var jobUpdateDto = _mapper.Map<JobDTO>(jobFromRepo);
patchJob.ApplyTo(jobUpdateDto);
_mapper.Map(jobUpdateDto, jobFromRepo);
await _jobManager.UpdateJobAsync(jobFromRepo);
return Ok(_mapper.Map<JobDTO>(jobUpdateDto));
}
回购
public async Task<IDataOperationResult> UpdateJobAsync(Job job) {
_context.Jobs.Update(job);
try {
await _context.SaveChangesAsync();
return new OperationResult(true);
} catch {
return new OperationResult(false);
}
}
如何对数据库中的 JobBudgetItem 进行更新?
解决方案
事实证明,我的 AutoMapper 实现让事情变得很糟糕。我选择忽略我JobBudgetItemDto
(子记录)上的 ID,这反过来又导致原始 ID 在保存到数据库之前被映射回来时消失。
CreateMap<JobBudgetItem, JobBudgetItemDTO>()
.ReverseMap();
//.ForMember(x => x.Id, opt => opt.Ignore()) // Removed this line.
推荐阅读
- c++ - QTreeWidget 的问题
- opengl - OpenGL 只会更新最后一个顶点数组对象
- vba - 复制并粘贴 VBA 代码 - 我想跨多个工作表使用
- firebase - App-Engine 是否适合作为 Firebase 数据库的后端侦听器以进行实时事件处理
- python-3.x - Python - 如果文件不存在,则返回空数据框
- mongodb - MongoDB如何添加条件$match条件
- php - 2个用户同时更新mysql表数据
- git - Jenkins Scripted Pipeline 为“sh”构建步骤提供 GitHub SSH 凭据
- c# - Asp.net Wildcard,如何根据文本框输入识别和填充标签
- vue.js - SyntaxError:将 lodash 与 Nuxt 一起使用时出现意外的令牌导出