C# DbContext-Get<;T>;返回动态表

C# DbContext-Get<;T>;返回动态表,c#,postgresql,types,dbcontext,dbset,C#,Postgresql,Types,Dbcontext,Dbset,我有一个dbContext类,例如,在其中编写了两个DbSet参数,用于处理两个表 public EntityCoreContext() { } public EntityCoreContext(DbContextOptions<EntityCoreContext> options) : base(options) { } public virtual DbSet<Languages> Languages { get; set; } public virtua

我有一个dbContext类,例如,在其中编写了两个DbSet参数,用于处理两个表

public EntityCoreContext()
{
}

public EntityCoreContext(DbContextOptions<EntityCoreContext> options)
    : base(options)
{
}

public virtual DbSet<Languages> Languages { get; set; }
public virtual DbSet<Users> Users { get; set; }
public EntityCoreContext()
{
}
公共EntityCoreContext(DbContextOptions选项)
:基本(选项)
{
}
公共虚拟数据库集语言{get;set;}
公共虚拟数据库集用户{get;set;}
我知道要从上下文中获取数据,我必须编写:
dbContext.Users.ToList()
dbContext.Languages.ToList()

我需要这样做,以便在不直接调用表名的情况下获取数据。从系列中:
dbContext.Get().ToList()
dbContext.Get().ToList()


好吧,或者换一种方式。因此,调用该表的方法是通用的。并且支持所有将要传递给他的表。必须对以下方法执行此操作:插入、更新、获取、删除。

在EntityFramework中存在
.Set()
,它将根据传递的类型返回
DbSet

因此,您可以使用:

dbContext.Set<Users>().ToList();
dbContext.Set().ToList();

我知道它的命名很奇怪,但是这里的
Set
方法返回了
DbSet
,它没有设置任何东西。

不确定它的好处是什么,但类似于这样:

public IQueryable<T> GetEntity() where T : class
{
    using (EntityCoreContext ctx = new EntityCoreContext())
    {
       return ctx.Set<T>();
    }
}
public IQueryable GetEntity(),其中T:class
{
使用(EntityCoreContext ctx=new EntityCoreContext())
{
返回ctx.Set();
}
}

或者根本不使用它们,因为配置的DbContext已经完成了所有这些工作。不需要“动态”表名,因为没有表名,它们是应用程序端实体。DbContext不是数据库的连接或模型,它是一个工作单元,不需要存储库,这就是DbSet的意义所在。而且不需要单一对象修改方法,命名也不奇怪。该方法正在返回一个集合。没有显式的修改方法,因为不需要任何修改-SaveChanges将保留所有修改您不需要任何修改,因为这正是DbContext和DbSet的作用所在。这些不是表,它们是应用程序端实体。DbContext不是数据库的连接或模型,而是一个工作单元。而且不需要类似于数据对象的方法,因为ORM已经同时处理多个对象的操作。您想要构建的方法不仅会损害性能,而且在逻辑上是错误的。DbContext是一个工作单元,因此它会缓存修改,直到要求它保存所有修改。要构建的
Insert()
也可以轻松执行500次删除。Gunnar Peipman的研究表明,这种尝试是多么错误——你试图在高级ORM之上强加一个低级数据访问对象接口。这是一个坏主意,早在2009年就被认为是一个坏主意,当时NHibernate使ORM在.NET中流行,并取代了那些“通用存储库”接口。当时NHibernate的维护者Oren Eini在最后的
dbContext中解释了这一点。Get()
dbContext.Users
一样是硬编码的。您仍然需要知道编译时实体的类型,但是如果使用了错误的类型,
Get
不会警告您。您想要解决的实际问题是什么
这样表调用的方法是通用的。
DbContext已经是通用的。您是否遇到了特定的问题并认为需要更大的灵活性?是否正在尝试创建一个用户可配置的开放式查询编辑器?还是一个适用于所有上下文的报告查询?这些可能很棘手,通常不适合与ORM一起使用。但是简单的CRUD、断开连接的操作、事务性更改很容易,而且已经实现了。要使用它,请创建一个包含GetEntity方法的(helper)类,并在需要的地方使用它。如果我可以问的话,你为什么要这样做?