.Net Core 中的通用存储库模式与 Entity Framework 有何相关性
What is the relevance of the Generic Repository Pattern in .Net Core with Entity Framework
我正在尝试(但未能)理解通用存储库模式在围绕 Entity Framework 或 EF Core 的特定实例中的用途。
这样写有什么好处:
public void Update(T obj)
{
DbContext.Set<T>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
当你通过简单地写成
来获得相同和更多
public void Update(Movie obj)
{
DbContext.Set<Movie>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
或
public void Update(Movie obj)
{
var movie = DbContext.Movies.FirsOrDefault(x => x.MovieId == obj.MovieId);
DbContext.Entry(movie).CurrentValues.SetValues(obj);
DbContext.SaveChanges();
}
我想我真正的问题是为什么我们要围绕基本上已经是通用存储库(具有更多功能和优化)的通用存储库包装一个通用存储库?
为了不冒昧,我想根据评论主题回答我自己的问题。
通用存储库模式是对象关系映射器 (ORM) 时代之前的遗留物,例如 Entity Framework、xHibernate、Dapper、PetaPoco 和其他一百万种。
随着 ORM 的出现,存储库模式中的所有功能都封装在 ORM 本身中。
例如,每次您在 DbContext 上调用 .SaveChanges()
时,Entity Framework 默认使用 Transaction/UnitOfWork。
它还会自动跟踪对查询返回的实体所做的更改,除非您明确告诉它不要使用 UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
。
就Generic Repositories而言,您认为以下代码是什么:
MyDbContext.Set<WeatherForecast>().Add(forecast);
我正在尝试(但未能)理解通用存储库模式在围绕 Entity Framework 或 EF Core 的特定实例中的用途。
这样写有什么好处:
public void Update(T obj)
{
DbContext.Set<T>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
当你通过简单地写成
来获得相同和更多public void Update(Movie obj)
{
DbContext.Set<Movie>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
或
public void Update(Movie obj)
{
var movie = DbContext.Movies.FirsOrDefault(x => x.MovieId == obj.MovieId);
DbContext.Entry(movie).CurrentValues.SetValues(obj);
DbContext.SaveChanges();
}
我想我真正的问题是为什么我们要围绕基本上已经是通用存储库(具有更多功能和优化)的通用存储库包装一个通用存储库?
为了不冒昧,我想根据评论主题回答我自己的问题。
通用存储库模式是对象关系映射器 (ORM) 时代之前的遗留物,例如 Entity Framework、xHibernate、Dapper、PetaPoco 和其他一百万种。
随着 ORM 的出现,存储库模式中的所有功能都封装在 ORM 本身中。
例如,每次您在 DbContext 上调用 .SaveChanges()
时,Entity Framework 默认使用 Transaction/UnitOfWork。
它还会自动跟踪对查询返回的实体所做的更改,除非您明确告诉它不要使用 UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
。
就Generic Repositories而言,您认为以下代码是什么:
MyDbContext.Set<WeatherForecast>().Add(forecast);