C# NETCore中的通用存储库模式与实体框架有什么关联

C# NETCore中的通用存储库模式与实体框架有什么关联,c#,entity-framework,generics,entity-framework-core,repository-pattern,C#,Entity Framework,Generics,Entity Framework Core,Repository Pattern,我试图(但未能)理解通用存储库模式在特定实例中的用途,该实例围绕实体框架或EF核心 写这篇文章有什么好处: public void Update(T obj) { DbContext.Set<T>().Attach(obj); DbContext.Entry(obj).State = EntityState.Modified; DbContext.SaveChanges(); } 我想我真正的问题是,为什么我们要将一个基本上已经是一个通用存储库(具有更多功能

我试图(但未能)理解通用存储库模式在特定实例中的用途,该实例围绕实体框架或EF核心

写这篇文章有什么好处:

public void Update(T obj)
{
    DbContext.Set<T>().Attach(obj);
    DbContext.Entry(obj).State = EntityState.Modified;
    DbContext.SaveChanges();
}

我想我真正的问题是,为什么我们要将一个基本上已经是一个通用存储库(具有更多功能和优化)的通用回购包装起来呢?

我想根据评论线索回答我自己的问题

通用存储库模式是对象关系映射器(ORM)时代之前的遗留模式,如实体框架、xHibernate、Dapper、PetaPoco和其他一百万种

随着ORM的出现,存储库模式中的所有特性都封装在ORM本身中

例如,在默认情况下,每次在DbContext上调用
.SaveChanges()
,Entity Framework都会使用事务/UnitOfWork

它还会自动跟踪对查询返回的实体所做的更改,除非您明确告诉它不要使用
UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)

就通用存储库而言,您认为以下代码是什么:

MyDbContext.Set<WeatherForecast>().Add(forecast);
MyDbContext.Set().Add(预测);

None-它是所有ORM的反模式,而不仅仅是EF核心。例如,
Update
可以执行3次删除和5次插入,同时对不相关的对象执行15次更新。当您想要抽象事物或实现可能更改时(例如,使用EF以外的内容),尤其是在DDD上下文中,您可以执行此操作。虽然我不得不承认它几乎没有任何用处……但我一直在发布Gunnar Peipman的链接,所以我不必每次都写同样的东西。@Haytam这就是DbSet和DbContext的意义所在。通用存储库来自以前的时代ORNs@Haytam使用ORMs,不需要通用存储库。所有这些方法都已由ORM本身提供。抽象事物需要专门的存储库,这些存储库可以抽象服务于业务操作可能需要的多个ORM操作
public void Update(Movie obj)
{
    var movie = DbContext.Movies.FirsOrDefault(x => x.MovieId == obj.MovieId);
    DbContext.Entry(movie).CurrentValues.SetValues(obj);
    DbContext.SaveChanges();
}
MyDbContext.Set<WeatherForecast>().Add(forecast);