【问题标题】:Entity Framework Core - Creating a dynamic DbSet Model from TableNameEntity Framework Core - 从 TableName 创建动态 DbSet 模型
【发布时间】:2019-12-06 03:25:18
【问题描述】:

假设我们有几个客户端,每个客户端都有一个带有“Employees”表的数据库,但是对于每个客户端,表都有点不同。大多数列是相同的,但有一些客户对该表的列更多/更少。

我目前有一个代表基本表的“Employee”类,它在我的 DbSet 中的 DbContext 中使用。 最终,我只想对该表进行一些 CRUD 操作。

使用 EFCore,我在编写通用代码时遇到了一些麻烦,该代码适用于所有客户端,无论该表有多少列。 (所有客户端的 tableName 保持不变)

关于如何解决这个问题的任何想法? 也许动态创建实体?还是扩展当前的“Employee”类?

【问题讨论】:

  • 为什么“Employees”表的同一个实体有不同的列?不同客户的附加列是什么?“员工”表是否需要这些列?
  • 本示例中的员工代表我的组织的不同类,这只是一个示例。每个客户都有代表“员工”的表的不同列,因为这些是要求。

标签: c# entity-framework-core


【解决方案1】:

继承有3种常见的实现方式

  • 按层次结构表 (TPH)
  • 每种类型的表 (TPT)
  • 每种混凝土类型的表 (TPC)

在 EF 核心中,只有第一个适用。此外,您可以指定鉴别器列的名称和数据类型以及表示每种类型的值。如果您使用流利的配置,它将是:

modelBuilder.Entity<Employee>()
    .ToTable("Employee")
    .HasDiscriminator<int>("EmployeeType")
    .HasValue<Vanilla>(1)
    .HasValue<Customer1>(2)
    .HasValue<Customer2>(3);

这会将所有值存储在一个表中,如果不是 Customer1,则 Costumer1 的特定值将为空。我按照您所说的“更多/更少列”制作了香草,而 Employee 将是所有人共同的真正基类。

另外,这里有一个如何设置table per hierarchy的例子。

【讨论】:

  • 谢谢。但是,如果我不知道为每个客户添加了多少列以及添加了哪些列怎么办?也许我需要像“Place Holder”这样的东西,某种可以接受任意数量的列而不知道每个列是哪种类型的对象? (仅限简单类型)
  • 在这种情况下,我个人使用 ssis 包将数据从外部系统导入本地数据库,添加同步时间锁和一些额外的字段来跟踪数据的导入时间。这是放在不同的数据库上,稍后从那里导入。此外,我还有一个 2 部分同步 chron 作业,它每 10 分钟运行一次。此外,我还有一个 chron 作业也可以进行导出,但它每天运行一次并序列化 xml 中的更改。外部系统可以进行相应的解析和修改。
猜你喜欢
  • 2019-03-09
  • 2017-06-01
  • 2020-08-31
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
相关资源
最近更新 更多