Различия между .CreateObjectSet <T>,.Set <T> и .CreateQuery <T>?
Я пишу общий репозиторий для фреймворка сущности и смущен тем, что разница между этими вызовами:
ObjectContext.CreateObjectSet<T>
ObjectContext.CreateQuery<T>
DbContext.Set<T>
Я хочу, чтобы общий репозиторий поддерживал контекст, созданный из .edmx файлов, а также первый код DbContext, поэтому я получил следующее:
public abstract class EntityRepository<TClass>
where TClass : class, new()
{
//private readonly TContext _context;
private readonly ObjectSet<TClass> _objectSet;
protected EntityRepository(IObjectContextAdapter context)
{
_objectSet = context.ObjectContext.CreateObjectSet<TClass>();
}
protected EntityRepository(ObjectContext context)
{
_objectSet = context.CreateObjectSet<TClass>();
}
public ObjectSet<TClass> Query()
{
return _objectSet;
}
}
В примерах, которые я видел в Интернете, я видел все 3 использованные, каковы фактические различия между ними? Лучше ли производительность? Я знаю, что вы можете писать запросы LINQ против контекстов, используя все 3 метода.
Ответы
Ответ 1
CreateObjectSet<T>
возвращает вам ObjectSet<T>
, который в основном собирает объекты T, с возможностью добавлять, удалять,... объект из этих коллекций, в результате позже вставляя, удаляет,... Вы также можете использовать его для запросов, Это как корень верхнего уровня для данного объекта.
CreateQuery<T>
дает вам ObjectQuery<T>
, который можно просмотреть как IEnumerable<T>
(он также IQueryable<T>
). Этот объект подобен подмножеству ObjectSet<T>
(некоторые условия и т.д.), Но вы не можете добавлять к нему элементы и т.д.
И, наконец, Set<T>
возвращает DbSet<T>
упрощенную версию первого метода/объекта для Code First. Например, проще использовать эти объекты (или, лучше сказать, интерфейсы; IDbSet<T>
), например, модульное тестирование и т.д. Подобно тем, что ObjectContext
и DbContext
.
Ответ 2
В дополнение к тому, что уже объяснил Jiri, существует перегрузка CreateObjectSet, которая не принимает аргументов. Эта перегрузка автоматически предполагает, что она должна вернуть ObjectSet для единственного EntitySet, связанного с TEntity. Он будет метаться, если у модели есть MEST (множественные сущности-наборы для каждого типа). Все перегрузки CreateQuery нуждаются в строке SQL Entity для загрузки запроса (обратите внимание, что имя EntitySet является допустимым SQL-запросом Entity).