Метод IDbSet и Exposing Include через метод расширения - PullRequest
17 голосов
/ 10 февраля 2011

Я использую подход Code-First с EF, и я хотел использовать IDbSet вместо DbSet, чтобы я мог проводить модульное тестирование с имитациями.Моя проблема в том, что я использую метод Include () для быстрой загрузки в случае необходимости, но метод Include () не предоставляется через IDbSet.Я видел пример кода, использующего метод расширения для выставления Include (), но он, похоже, не работает для меня;объект objectQuery в этом примере всегда имеет значение null.Пожалуйста, дайте мне знать, как это исправить.

public static class IQueryableExtension
{
    public static IQueryable<T> Include<T>(this IQueryable<T> source, string path)
        where T : class
    {
        ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
        if (objectQuery != null)
        {
            return objectQuery.Include(path);
        }
        return source;
    }

    public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, 
        System.Linq.Expressions.Expression<Func<T, TProperty>> path)
        where T : class
    {
        ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
        if (objectQuery != null)
        {
            return source.Include(path);
        }
        return source;
    }
}

Ответы [ 2 ]

28 голосов
/ 10 февраля 2011

Вам не нужно писать такое расширение, если вы используете CTP5. CTP5 обеспечивает Include расширение для IQueryable.Вы должны сослаться на EntityFramework.dll (CTP5) и добавить:

using System.Data.Entity;

Ваша версия, вероятно, не работает, потому что вы конвертируете источник в ObjectQuery, но, скорее всего, он будет иметь тип DbQuery.

0 голосов
/ 10 февраля 2011

Убедитесь, что у вас есть свойство using, которое содержит вышеуказанный статический класс.Простое копирование / вставка кода приводит к тому, что IDbSet предоставляет методы include при обращении к правильному пространству имен.

...