Entity framework 4 IDbSet和通过扩展方法公开Include方法

Entity framework 4 IDbSet和通过扩展方法公开Include方法,entity-framework-4,asp.net-mvc-3,code-first,Entity Framework 4,Asp.net Mvc 3,Code First,我对EF使用代码优先的方法,我想使用IDbSet而不是DbSet,这样我就可以用mock进行单元测试。我的问题是,我在必要时使用Include()方法进行即时加载,但Include()没有通过IDbSet公开。我看到一个使用扩展方法公开Include()的示例代码,但它似乎对我不起作用;本例中的objectQuery对象始终为null。请让我知道如何解决这个问题 public static class IQueryableExtension { public static IQuerya

我对EF使用代码优先的方法,我想使用IDbSet而不是DbSet,这样我就可以用mock进行单元测试。我的问题是,我在必要时使用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;
    }
}
公共静态类IQueryableExtension
{
公共静态IQueryable包含(此IQueryable源,字符串路径)
T:在哪里上课
{
ObjectQuery ObjectQuery=源作为ObjectQuery;
if(objectQuery!=null)
{
返回objectQuery.Include(路径);
}
返回源;
}
公共静态IQueryable包括(此IQueryable源,
System.Linq.Expressions.Expression路径)
T:在哪里上课
{
ObjectQuery ObjectQuery=源作为ObjectQuery;
if(objectQuery!=null)
{
返回源。包括(路径);
}
返回源;
}
}

如果使用CTP5,则无需编写此类扩展<代码>包括
iQuery的扩展名
。您必须引用EntityFramework.dll(CTP5)并添加:


您的版本可能无法工作,因为您正在将源代码转换为
ObjectQuery
,但它很可能是
DbQuery

类型。请确保使用包含上述静态类的
语句具有属性
。简单地复制/粘贴代码会导致IDbSet在引用正确的命名空间时暴露include方法。

我没有理解您最初所说的内容。但后来我意识到,我需要在编写linq语句(服务类)的文件上使用using语句来使用Include(),而不仅仅是在我创建的DbContext(session.cs)文件上。非常感谢。唉,对单元可测试EF的追求已经达到了它的目标。谢谢
using System.Data.Entity;