通用存储库中的 DbContext 和 DbSet 问题

DbContext and DbSet issues in Generic repository

我正在尝试创建一个将在我的所有项目中扮演存储库角色的项目。

想法:

这个想法的灵感来自 通用存储库模式 ,所以我正在尝试创建一个 generic class 将成为存储库。 此 class 将在实例化时收到 dbcontext。 class 将实现 Interface.

界面:

interface IRepo<Tcontext> where  Tcontext : DbContext
{
    void GetAll<Table>();
}

回购 class :

public class Repo<Tcontext>:IRepo<Tcontext> where Tcontext: DbContext
{
    private Tcontext _Context { get; set; } = null;
    private DbSet    _Table   { get; set; } = null;


    public Repo()
    {
        _Context = new Tcontext();
    }
   

    public void GetAll<Table>()
    {
        _Table = new DbSet<Table>();

        return _Context.Set<Table>().ToList();
    }
}

所以,这个想法,假设我们有这个 dbcontext class:DBEntities,如果我想 select 来自 Client table 的所有记录],然后在另一行中我想要 select 来自 Order table

的所有记录

我会用:

        Repo<DBEntities> repo = new Repo<DBEntities>();

       var clients repo.GetAll<Client>();
       var orders repo.GetAll<Order>();

问题是什么:

Repoclass中的问题。 问题是四个错误我不知道如何解决它们。

错误:

那么,有任何解决此问题的帮助吗? 并在此先致谢。

前两个错误 The Table must be a reference type.... 已记录,因为您尚未定义函数的约束。如下所示更改签名;使用下面的签名,该方法限制泛型类型 Table 应该是引用类型。

public void GetAll<Table>() where Table : class

第三个错误,因为没有 public DBContext 的默认构造函数。您应该使用参数化的。检查 DBContext 定义 here

_Context = new Tcontext(connectionString);

第四个错误将在添加前两个错误后自动解决,因为定义了通用参数 Table 约束。您可以在 here.

检查 Set 函数的签名