簡體   English   中英

不更新數據庫ASP.net Core 2.0上的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM