实体框架核心-从TableName创建动态DbSet模型

时间:2019-07-28 16:24:08

标签: c# entity-framework-core

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

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

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

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

1 个答案:

答案 0 :(得分: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的特定值将为null。正如您说的“多/少列”一样,我制作了香草,而Employee将是所有人通用的真正基类。

此外,这是一个如何设置table per hierarchy的示例。