如何使“通用”C#存储库在其构造函数中接受上下文

时间:2015-06-28 03:44:03

标签: c#

我正在讨论如何使用Entity Framework创建通用MVC存储库的tutorial。我能够对特定的名称进行更改,以便它可以与我所使用的系统一起使用。从单独的教程中,我学习了如何创建接口并重写通用存储库类来实现接口。

测试效果很好。但是,我注意到虽然存储库类是一个“通用”类,但该类似乎被绑定到一个特定的数据库上下文SkillJournalContext。有没有办法可以用通用名称替换SkillJournalContext,以便我可以在项目中使用与任何其他数据库上下文相同的存储库? (我在项目中有两个其他上下文,每个上下文指向不同的数据库)。

我想这样做,以便我不为其他两个数据库上下文重新键入相同的代码。我使用“MVC存储库”和“数据库上下文参数”的变体搜索了网络,并被引导到我使用的相同教程。

是否需要将存储库绑定到一个特定的数据库上下文,或者可以像我希望的那样使其成为通用存储库?

public class GenericRepositorySkill<TEntity> : IGenericRepository<TEntity>
                 where TEntity : class
{
    internal SkillJournalContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepositorySkill(SkillJournalContext context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }

    // .... and so on
}

1 个答案:

答案 0 :(得分:2)

感谢来自@Mati Cicero的灵感,我将SkillJournalContext替换为DbContext。这样做了。

我将internal更改为DbContext类型,并将参数更改为DbContext类型。没有编译错误,浏览器测试按预期工作。

既然这不依赖于特定的数据库上下文,我就可以相应地重命名存储库类和构造函数。

    internal DbContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(DbContext _context)
    {
        this.context = _context;
        this.dbSet = context.Set<TEntity>();
    }