通过扩展方法IDbSet和Exposing Include方法

时间:2011-02-09 21:06:20

标签: entity-framework-4 asp.net-mvc-3 code-first

我正在使用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;
    }
}

2 个答案:

答案 0 :(得分:28)

如果您使用的是CTP5,则无需编写此类扩展名。 Include的{​​{3}} IQueryable扩展名。您必须引用EntityFramework.dll(CTP5)并添加:

using System.Data.Entity;

您的版本可能无效,因为您要将源代码转换为ObjectQuery,但很可能属于DbQuery类型。

答案 1 :(得分:0)

确保您拥有包含上述静态类的属性using语句。简单地复制/粘贴代码会导致IDbSet在引用正确的命名空间时公开include方法。