[英]Not updating object on database 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();
上設置一個斷點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);
}
您應該在函數中使用async / await:
public async Task CompleteAsync()
{
await context.SaveChangesAsync();
}
您缺少存儲庫和UnitOfWork之間的鏈接。 the unit of work, ie the UoW should be just a wrapper for all the repositories related to one database, with the extra purpose of maintaining your data consistency. 為了使模式正常工作,然后保留數據,您應該只工作單元訪問存儲庫的方法,即,UoW應該只是與一個數據庫相關的所有存儲庫的包裝,另外還有維護目的您的數據一致性。
在控制器中,您首先baseExercise
通過repository.GetExercise(id)
檢索baseExercise
,然后嘗試使用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 Docs 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.