模拟DbContext.Set <t>()?</t>

时间:2011-02-15 17:25:42

标签: entity-framework-4 ef-code-first

我们首先使用EF代码,并为我们的销售数据库提供数据上下文。此外,我们有一个位于数据上下文之上的类,并执行一些基本的CRUD操作。

例如,我们有以下功能:

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功能?

1 个答案:

答案 0 :(得分:11)

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

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

我使用了不同的名称,但如果您希望隐藏常规实现,则可以使用new运算符。