Подтвердить что ты не робот

Метод IDbSet и Exposing Include через метод расширения

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

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;
    }
}
4b9b3361

Ответ 1

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

using System.Data.Entity;

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

Ответ 2

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