Не обновляет объект в базе данных ASP.net core 2.0

У меня есть небольшая проблема, которую я не могу полностью понять.

На моем контроллере у меня есть:

        [HttpPut("{id}")]
    public async Task<IActionResult> PutExercise([FromRoute] int id, [FromBody] Exercise exercise)
    {
        logger.LogInformation("Updating item {ID}", id);
        if (!ModelState.IsValid)
            return BadRequest(ModelState);            

        if (id != exercise.ExerciseId)
            return BadRequest();

        var baseExercise = await repository.GetExercise(id);
        if (baseExercise == null)
            return NotFound(id);

        baseExercise = exercise;
        await unitOfWork.CompleteAsync();

        return NoContent();
    }

но он НЕ обновляет базу данных значениями, указанными в запросе тела PUT. Хотя в памяти они меняются, объект не выдвигается... Но если я установлю точку останова на await unitOfWork.CompleteAsync(); а затем измените baseExercise с помощью отладчика, он обновляется. Почему это происходит?

    public class UnitOfWork : IUnitOfWork
{
    private readonly FitaholicContext context;

    public UnitOfWork(FitaholicContext context)
    {
        this.context = context;
    }
    public Task CompleteAsync()
    { 
        return context.SaveChangesAsync();
    }
}

-

public async Task<Exercise> GetExercise(int id, bool includeRelated = false)
    {
        if (!includeRelated)
            return await context.Exercise.SingleOrDefaultAsync(m => m.ExerciseId == id);

        return await context.Exercise
                    .Include(e => e.Equipments)
                        .ThenInclude(ee => ee.Equipment)
                    .Include(e => e.TypeRecord)
                    .SingleOrDefaultAsync(m => m.ExerciseId == id);
    }

2 ответа

Вы должны использовать async/await в функции:

    public async Task CompleteAsync()
    { 
        await context.SaveChangesAsync();
    }

Вам не хватает связи между репозиторием и UnitOfWork. Чтобы заставить шаблон работать, а затем сохранить ваши данные, вы должны обращаться к методам репозитория только через единицу работы, т. Е. UoW должен быть просто оболочкой для всех репозиториев, связанных с одной базой данных, с дополнительной целью поддержки согласованность ваших данных.
В контроллере ваше первое получение baseExercise с помощью repository.GetExercise(id), то вы пытаетесь сохранить данные с unitOfWork.CompleteAsync(), Проблема в том, что вы не проинструктировали uniOfWork заботиться о repository поведение.
Тем не менее, это должно быть быстрое решение.
Сначала установите первую часть ссылки в UnitOfWork:

public class UnitOfWork : IUnitOfWork
{
    private readonly FitaholicContext context;

    public UnitOfWork(FitaholicContext context)
    {
        this.context = context;
    }

    private Repository _repository;
    public Repository repository =>
        this._repository ?? (this._repository =
            new Repository(this.context));

    public Task CompleteAsync()
    { 
        return context.SaveChangesAsync();
    }
}

Затем вторая половина, в Repository:

public class Repository
{
     public Repository(FitaholicContext context)
     { }

     public async Task<Exercise> GetExercise(int id, bool includeRelated = false)
     { ... }
 }  

Последний шаг, обновление PutExercise() в контроллере для отражения логики изменений:

[HttpPut("{id}")]
public async Task<IActionResult> PutExercise([FromRoute] int id, [FromBody] Exercise exercise)
{
    ...

    var baseExercise = await this.unitOfWork.repository.GetExercise(id);

    ...

    await this.unitOfWork.CompleteAsync();

    return NoContent();
}  

Если вам нужно немного углубиться в шаблон Repository-UnitOfWork, проверьте документы Microsoft.

Другие вопросы по тегам