存储库模式 EF Core 更新方法

Azz*_*onn 8 c# entity-framework-core asp.net-core-mvc

我有一个关于在带有 Entity Framework Core 的 MVC Web 应用程序中使用存储库模式和工作单元模式的问题。

我目前正在控制器中实现更新功能。现在,此时我不确定更新实体的最佳方法是什么。我看过一些视频,他们说像这样的存储库中不应存在 Update 方法:

public T Update(T entity)
{
  DbSet.Attach(entity);
  var entry = Context.Entry(entity);
  entry.State = System.Data.EntityState.Modified;
}
Run Code Online (Sandbox Code Playgroud)

所以这意味着我必须在控制器中这样做:

public IActionResult Edit(int id, [Bind("NeighbourhoodGroup,Neighbourhood,NeighbourhoodId")] Neighbourhoods neighbourhoods)
{
  var neighbourhoodsFound = unitOfWork.Neighbourhoods.Get(id);
  neighbourhoodsFound.Neighbourhood = neighbourhoods.Neighbourhood;
  neighbourhoodsFound.NeighbourhoodGroup = neighbourhoods.NeighbourhoodGroup;
}
Run Code Online (Sandbox Code Playgroud)

但是,这意味着我必须在所有控制器中都这样做,即使对象有很多属性?

我希望有人可以就最好的方法给我一些建议。

小智 4

在您的存储库中,您可以使用如下简单的更新功能:

public void Update(T entity)
    {
        DbSet.Attach(entity);
        ApplicationContext.Entry(entity).State = EntityState.Modified;
    }
Run Code Online (Sandbox Code Playgroud)

在控制器中或从您喜欢进行更新的任何位置时,您最好可以通过 id 获取实体,修改要在实体上修改的所有属性,从存储库调用 Update 方法,该方法将其状态设置为修改并最终在 EF 上下文上调用 Save 或 SaveAsync 方法。您的 EF 上下文应该在您的 UnitOfWork 中公开。

有关更详细的解释,您可以查看这篇文章,它将非常有帮助。EF 存储库模式

  • EF 上下文*是*工作单元。DbSet *是*“通用”存储库。该文章中显示的通用存储库是一种反模式。检查[不需要 Entity Framework Core 的存储库和工作单元](https://gunnarpeipman.com/ef-core-repository-unit-of-work/)。Gunnar Peipman 在一篇文章中收集了通用存储库的所有问题,因此我们不必重复它们 (5认同)