存储库模式EF核心更新方法

时间:2019-12-03 09:10:13

标签: c# asp.net-core-mvc entity-framework-core

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

我当前正在控制器中实现更新功能。现在,我不知道最好的方法是更新实体。我看过一些视频,他们说更新方法不应出现在这样的存储库中:

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

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

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;
}

但是,这意味着即使对象具有很多属性,我也必须在所有控制器中执行此操作?

我希望有人能给我一些关于最佳方法的建议。

2 个答案:

答案 0 :(得分:0)

在您的存储库中,您可以具有以下简单的更新功能:

public void Update(T entity)
    {
        DbSet.Attach(entity);
        ApplicationContext.Entry(entity).State = EntityState.Modified;
    }

无论是在控制器中还是在您希望进行更新的地方,都可以通过id获得实体,最好修改要在实体上修改的所有属性,然后从要设置的存储库中调用Update方法修改其状态,最后在EF上下文中调用Save或SaveAsync方法。您的EF上下文应在您的UnitOfWork中公开。

有关更多详细说明,您可以查看这篇文章,这将非常有帮助。 EF Repository Pattern

答案 1 :(得分:-1)

  1. 我没有在存储库中使用Update方法的问题。没关系。根据条件从存储库中读取数据更为复杂。在这里,您可以查看Microsoft中的示例。
  2. 控制器不是描述业务案例的好地方:做一些业务逻辑然后保存到存储库等。考虑使用MediatR作为描述特定业务案例的一种方法,而不是将其放入控制器。

另外,了解clean architecture也很有用。