2011-02-09 52 views
17

我对EF使用Code-First方法,并且我想使用IDbSet而不是DbSet,因此我可以使用mocks进行单元测试。我的问题是我在必要时使用Include()方法进行加载,但Include()不通过IDbSet公开。我看到一个示例代码使用扩展方法来公开Include(),但它似乎不适用于我;此示例中的objectQuery对象始终为空。请让我知道如何解决这个问题。通过扩展方法IDbSet和公开包含方法

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

回答

28

如果您使用CTP5,则无需编写此类扩展名。 CTP5 providesInclude扩展名为IQueryable。你必须引用EntityFramework.dll(CTP5),并添加:

using System.Data.Entity; 

您的版本可能不工作,因为你正在转换源ObjectQuery,但它很可能将是DbQuery类型。

+0

我一开始并没有明白你的意思。但后来我意识到我需要在使用Include()编写linq语句(services类)的文件上使用using语句,而不仅仅是在创建我的DbContext(session.cs)的文件上。谢谢!!! – enamrik 2011-02-09 21:34:45

0

确保您拥有包含上述静态类的属性using声明。代码的简单复制/粘贴会导致IDbSet在引用适当的名称空间时暴露包含方法。