我正在使用EF的Code-First方法,我想使用IDbSet而不是DbSet,所以我可以使用模拟进行单元测试。我的问题是我在必要时使用Include()方法进行急切加载,但不通过IDbSet公开Include()。我看到一个示例代码使用扩展方法来公开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;
}
}
答案 0 :(得分:28)
如果您使用的是CTP5,则无需编写此类扩展名。 Include
的{{3}} IQueryable
扩展名。您必须引用EntityFramework.dll(CTP5)并添加:
using System.Data.Entity;
您的版本可能无效,因为您要将源代码转换为ObjectQuery
,但很可能属于DbQuery
类型。
答案 1 :(得分:0)
确保您拥有包含上述静态类的属性using
语句。简单地复制/粘贴代码会导致IDbSet在引用正确的命名空间时公开include方法。