Метод IDbSet и Exposing Include через метод расширения
Я использую подход 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 ответа
Вам не нужно писать такое расширение, если вы используете CTP5. CTP5 обеспечивает Include
расширение для IQueryable
, Вы должны сослаться на EntityFramework.dll (CTP5) и добавить:
using System.Data.Entity;
Ваша версия, вероятно, не работает, потому что вы конвертируете источник в ObjectQuery
но это, скорее всего, будет иметь тип DbQuery
,
Убедитесь, что у вас есть собственность using
заявления, которые содержат вышеупомянутый статический класс. Простое копирование / вставка вашего кода приводит к тому, что IDbSet предоставляет методы include при обращении к правильному пространству имен.