PATCH'ing связанные данные ASP.NET Core Web API - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть Job класс со многими JobBudgetItem с. Я реализую метод PATCH на контроллере, используя встроенную библиотеку JsonPatch от Microsoft. У меня проблема в том, что когда я пытаюсь обновить поле в JobBudgetItem, EF Core не сохраняет изменения. Вместо этого он создает дубликаты каждого существующего JobBudgetItem с другим идентификатором.

Работа

public int Id { get; set; }
public string Name { get; set; }

public IEnumerable<JobBudgetItem> JobBudgetItems { get; set; }

JobBudgetItem

public int Id { get; set; }
public string Category { get; set; }

public int JobId { get; set; }
public Job job { get; set; } 

GET / Job / 1

  {
        "id": 1,
        "name": "Test", 
        "jobBudgetItems": [
            {
                "id": 1,
                "category": "ATestCategory",
            },
            {
                "id": 12,
                "category": "BTestCategory",
            }
       ]
 }

PATCH / Job / 1

[{
    "op": "replace", "path": "/jobBudgetItems/0/category", "value": "CTestCategory"
}]

JobsController

[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));

}

Repo

    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 сохранялось в базе данных?

1 Ответ

0 голосов
/ 25 апреля 2018

Оказывается, моя реализация AutoMapper - это то, что отбросило вещи. Я решил игнорировать идентификатор в моей JobBudgetItemDto (дочерней записи), что, в свою очередь, приводило к исчезновению исходного идентификатора при его сопоставлении перед сохранением в базе данных.

        CreateMap<JobBudgetItem, JobBudgetItemDTO>()
            .ReverseMap();
            //.ForMember(x => x.Id, opt => opt.Ignore()) // Removed this line.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...