2013-05-06 91 views
2

一個模擬的背景下,我有我的上下文,它包含的東西,如:無法建立在實體框架5

public partial class MyEntities : DbContext 
{ 
    ... 
    public DbSet<Cat> Cats { get; set; } 
} 

我想嘲笑它。

我創建了另一個實現我稱爲IContext的接口的部分類。

我必須把這個接口

public interface IContext 
{ 
    DbSet<Cat> Cats { get; set; } 
} 

然後我就可以創建一個模擬,每個人都高興。

除了我不想在我的界面中使用DbSet<Cat>。這似乎是錯誤的,因爲我不會使用數據庫。有什麼方法可以改變它,或者有更好的解決方案嗎?很顯然,上下文是從模板自動生成的,所以如果不在重新生成時丟失它,我無法對其進行編輯。

我不太確定如何繼續創建模擬上下文。有任何想法嗎?

回答

2

有一種方法。

您可以返回IDbSet而不是DbSet,然後在模擬設置中,您可以提供模擬的IDbSet作爲模擬IContext中Cats屬性的返回值。

public interface IContext 
{ 
    IDbSet<Cat> Cats{get;set;} 
} 
public partial class MyEntities : DbContext , IContext 
{ 
    public IDbSet<Cat> Cats { get; set; } 
} 

但也許更好,在你的界面中不要爲每個實體類引入屬性。 insted的你IDbContext可能是唯一的:

public interface IContext 
{ 
    IDbSet<T> Set<T>(); 
} 

,您可以用

var query = dbContext.Set<Cat>().Where(....) 

這種方式查詢你應該沒有問題「模擬」了。

+0

我不知道我怎樣才能改變'DbSet ''到IDbSet ''因爲DbSet '在自動生成的'MyEntities'類 – NibblyPig 2013-05-06 12:43:08

+0

不知道存在你如何autogenerating。如果你使用T4模板,你可以修改它,不應該是一個大問題。你仍然可以去T套()。但是這需要您以不同方式編寫查詢,而不使用DbContext集屬性。 – jure 2013-05-06 12:46:31

+0

@jure你的意思是'IDbSet Set ();'?只是'T'的返回類型意味着'Set ()'返回一個'Cat'。 – grant 2013-05-17 00:20:48