Различия между .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).