2011-02-15 38 views
10

我們首先使用EF代碼,併爲我們的銷售數據庫提供數據上下文。另外,我們有一個位於數據上下文之上的類,它執行一些基本的CRUD操作。Mocking DbContext.Set <T>()?

例如,我們有以下功能:

public static T Create<T>(int userId, T entity) where T : class, IAllowCreate 
{ 
    if (entity == null) 
     throw new ArgumentNullException("entity"); 

    using (SalesContext dc = new SalesContext()) 
    { 
     dc.Set<T>().Add(entity); 
     dc.SaveChanges(); 

     return entity; 
    } 
} 

我發現an example of如何製造假背景和IDBset性能。我開始實施,但我遇到了一個問題。

我們在我們的代碼中非常自由地使用dc.Set(),因爲我們試圖創建通用的CRUD方法。而不是有一個ReadCustomer,ReadContact等,我們只是做Read()。但是,dc.Set返回一個DbSet,而不是一個IDbSet,所以我無法嘲笑它。

有沒有人能夠模擬或假的DbContext,仍然使用Set功能?

回答

11
interface ISalesContext 
{ 
    IDbSet<T> GetIDbSet<T>(); 
} 

class SalesContext : DbContext, ISalesContext 
{ 
    public IDbSet<T> GetIDbSet<T>() 
    { 
     return Set<T>(); 
    } 
} 

我用不同的名字,但如果你喜歡隱藏定時執行,你可以使用new操作。

+0

我開始走下那條路,放棄得太快。最後我還需要添加一個GetNonTrackedDbSet()。 – taylonr 2011-02-15 19:22:53