【问题标题】:DbContext and DbSet issues in Generic repository通用存储库中的 DbContext 和 DbSet 问题
【发布时间】:2021-01-22 06:03:35
【问题描述】:

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

理念:

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

界面:

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

回购类:

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 类:DBEntities,如果我想从Client 表中选择所有记录,然后在另一行中我想从Order 表中选择所有记录

我会使用:

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

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

有什么问题:

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

错误:

那么请帮助解决这个问题?并在此先感谢您。

【问题讨论】:

    标签: c# generics repository-pattern generic-programming


    【解决方案1】:

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

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

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

    _Context = new Tcontext(connectionString);
    

    第四个错误将在添加前两个的更改后自动解决,因为定义了泛型参数Table 约束。您可以在here 处查看Set 函数的签名。

    【讨论】:

    • 我仍然有这些错误imgur.com/qyTaIxZ
    • 1) 约束应该在接口和类实现中定义。 2) 您的方法GetTable 的返回类型为 void?它应该不是合适的类型。
    • 非常感谢先生,这非常有帮助,先生,我很感激您,但是我对您的回答有一个小注释,我不需要将连接字符串发送到DBContext,无需connection string
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多