Какова актуальность шаблона Generic Repository в .Net Core с 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();
}
Я предполагаю, что мой настоящий вопрос заключается в том, почему мы оборачиваем универсальное репо вокруг того, что в основном уже является общим репозиторием (с большим количеством функций и оптимизаций)?
1 ответ
Не проявляя излишней самонадеянности, я хотел бы ответить на свой вопрос, основанный на ветке комментариев.
Общий шаблон репозитория - это пережиток времен, предшествовавших эпохе объектно-реляционных сопоставлений (ORM), таких как Entity Framework, xHibernate, Dapper, PetaPoco и миллиона других.
С появлением ORM все функции, обнаруженные в шаблоне репозитория, инкапсулированы в самом ORM.
Например, Entity Framework по умолчанию использует Transaction/UnitOfWork каждый раз, когда вы вызываете .SaveChanges()
в DbContext.
Он также автоматически отслеживает изменения, внесенные в объекты, возвращаемые запросом, если вы явно не укажете ему не делать этого с помощьюUseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
.
Что касается общих репозиториев, как вы думаете, что это за код:
MyDbContext.Set<WeatherForecast>().Add(forecast);