【问题标题】:Set dynamic table name(database table) to one single entity in EntityFrameworkCore将动态表名(数据库表)设置为 EntityFrameworkCore 中的单个实体
【发布时间】:2022-10-02 22:04:24
【问题描述】:

我有许多表具有相同的模型结构,但表名和数据不同。

例如

//Model

public class pgl1
{
   public string id {get;set;}
   public string name {get;set;}
} 

public class pgl2
{
   public string id {get;set;}
   public string name {get;set;}
} 

我在数据库中的表是pgl_1pgl_2pgl_3 等...

上下文类 -

public class MyContext : DbContext
{
    public DbSet<pgl1>? pgl_1{ get; set; } //pgl_1 is database table name
    public DbSet<pgl2>? pgl_2{ get; set; } //pgl_2 is database table name
}

我将在下面使用它来实现它。

var context = new MyContext();

List<<*pgl1>> list1 = new List<<*pgl1>>();

listb = context.pgl1.ToList<<*pgl1>>();

List<<*pgl2>> list2 = new List<<*pgl2>>();

list2 = context.pgl2.ToList<*pgl2>>();

我只想要一个模型和一个 Dbset 用于多个表。

这可能吗。

我为此搜索了很多,但没有得到任何适当的解决方案。

任何答案都会非常有帮助。

谢谢。

  • this 会回答你的问题吗?
  • 也许你不需要EF?它不是为在这种动态环境中工作而设计的。 linq2db 将轻松处理。
  • EF 是一个 ORM - 它将对象映射到关系表。 DbSet<T> 不代表数据库表,它代表应用程序实体。此外,你为什么有这么多桌子?你怎么知道每次选哪张桌子?也许 EF 已经处理了你的真实的问题,只是不像你想象的那样?
  • 为什么一开始就有这么多相同的表?实现继承?分区?多租户?所有这些都可以以更清洁的方式处理。 EF 已经支持继承。分区是一个数据库问题,大多数时候你需要有多个表。例如,所有受支持的 SQL Server 版本都具有表分区,即使是 Express 版本。没有理由使用pg_2022pg_2021。可以使用拦截器、全局查询过滤器或使用 DbContextFactory 的动态连接字符串来处理多租户
  • 在 SQL Server(和大多数数据库)中,您还可以使用 partitioned views 来组合所有表中的数据,因此 EF 只需映射到该视图

标签: asp.net-core entity-framework-core


【解决方案1】:

这里的主要问题是实体表在OnModelCreating 方法中设置,该方法在您的数据库上下文在传入的http 请求上实例化后立即执行,之后您无法更改它。

这里最简单的解决方法是不要在OnModelCreating 中使用实体到模型绑定,而是在DbContext 实现中编写自己的CRUD 方法,这将使用tableName 参数来动态构建SQL 查询字符串。

base.Database.ExecuteSqlRaw($"INSERT INTO {tableName} ...");

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多