Cap*_*chi 5 c# generics entity-framework repository-pattern entity-framework-core
我正在尝试(但未能)理解通用存储库模式在包裹实体框架或 EF Core 的特定实例中的用途。
写这个有什么好处:
public void Update(T obj)
{
DbContext.Set<T>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
当你通过简单地写成相同或更多的东西时
public void Update(Movie obj)
{
DbContext.Set<Movie>().Attach(obj);
DbContext.Entry(obj).State = EntityState.Modified;
DbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
或者
public void Update(Movie obj)
{
var movie = DbContext.Movies.FirsOrDefault(x => x.MovieId == obj.MovieId);
DbContext.Entry(movie).CurrentValues.SetValues(obj);
DbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我想我真正的问题是为什么我们要围绕基本上已经是通用存储库(具有更多功能和优化)的通用存储库进行包装?
不想太自以为是,我想根据评论线程回答我自己的问题。
通用存储库模式是对象关系映射器 (ORM) 时代之前的遗留物,例如 Entity Framework、xHibernate、Dapper、PetaPoco 和其他上百万种映射器。
随着 ORM 的出现,存储库模式中的所有功能都封装在 ORM 本身中。
例如,每次调用.SaveChanges()DbContext 时,实体框架默认都会使用 Transaction/UnitOfWork。
它还会自动跟踪对查询返回的实体所做的更改,除非您明确告诉它不要这样做UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)。
就通用存储库而言,您认为以下代码是什么:
MyDbContext.Set<WeatherForecast>().Add(forecast);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1448 次 |
| 最近记录: |