模拟 DbContext.Set()?

发布于 2024-10-17 15:55:40 字数 792 浏览 3 评论 0原文

我们首先使用 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;
    }
}

我发现 如何创建假上下文和 IDBset 属性的示例。我开始实施它,但遇到了一个问题。

当我们尝试创建通用的 CRUD 方法时,我们在代码中相当自由地使用 dc.Set()(如上所示)。我们只需执行 Read(),而不是使用 ReadCustomer、ReadContact 等。但是,dc.Set 返回一个 DbSet,而不是 IDbSet,所以我无法模拟它。

有没有人能够模拟或伪造 DbContext 并且仍然使用 Set 功能?

We're using EF Code first, and have a data context for our sales database. Additionally, we have a class that sits on top of our data context and does some basic CRUD operations.

For example, we have the following function:

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;
    }
}

I found an example of how to create fake contexts and IDBset properties. I started implementing that, but I ran in to an issue.

We use dc.Set() quite liberally (as seen above) in our code, as we attempt to create generic CRUD methods. Instead of having a ReadCustomer, ReadContact etc, we would just do Read(). However, dc.Set returns a DbSet, not an IDbSet, so I'm not able to mock that.

Has anyone been able to mock or fake DbContext and still use the Set functionality?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迷离° 2024-10-24 15:55:40
interface ISalesContext
{
    IDbSet<T> GetIDbSet<T>();
}

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

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

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

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

I used a different name, but you can use the new operator if you prefer to hide the regular implementation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文