2013-05-06 86 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