首页 > 解决方案 > 修补相关数据 ASP.NET Core Web API

问题描述

我有一Job堂有很多JobBudgetItems的课。我正在使用 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 进行更新?

标签: c#asp.netentity-frameworkasp.net-core

解决方案


事实证明,我的 AutoMapper 实现让事情变得很糟糕。我选择忽略我JobBudgetItemDto(子记录)上的 ID,这反过来又导致原始 ID 在保存到数据库之前被映射回来时消失。

        CreateMap<JobBudgetItem, JobBudgetItemDTO>()
            .ReverseMap();
            //.ForMember(x => x.Id, opt => opt.Ignore()) // Removed this line.

推荐阅读