2011-02-09 64 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在引用適當的名稱空間時暴露包含方法。