Не обновляет объект в базе данных 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.