EF Core:将DbContext实体拆分为多个表

时间:2019-03-07 21:49:12

标签: c# entity-framework entity-framework-core

我正在尝试使用EntityFramework Core来存储共享同一模型但起源不同的实体。我有一个ProductType枚举,它指定实体的类型。

public enum ProductType
{
  Digital,
  Furniture,
  Health,
}

public class ProductModel
{
  public int Id {get; set;}
  public ProductType Type {get;set;}
  public decimal Price {get; set;}
  public int Stock {get;set;}
}

我正在使用派生的DbContext与SqlServer Express进行交互:

public class ProductDbContext : DbContext
{
  public ProductType ProductType { get; }
  public DbSet<ProductModel> Products { get; }

  public ProductDbContext( ProductType type )
  {
    ProductType = type;
  }

  protected override void OnModelCreating( ModelBuilder modelBuilder )
  {
    var productEntity = modelBuilder.Entity<ProductModel>()
       .ToTable( $"Products-{ProductType}" );
  }
}

我希望将每个ProductType拆分到自己的表中,以便将产品存储在dbo.Products-Digitaldbo.Products-Furnituredbo.Products-Health中。

以上实现仅适用于单个ProductType,但是当我尝试为多个表创建表时,我开始遇到问题。运行以下命令(显然)会导致问题,因为它只会为遇到的第一个ProductType创建一个表,因为在此之后已经创建了数据库:

var types = Enum.GetValues( typeof(ProductType) ).Cast<ProductType>();
foreach( var type in types )
{
  var context = new ProductDbContext( type );
  context.Database.EnsureCreated();
}

我希望能够随着时间的推移添加新的ProductType值,并让EFCore自动为每个表创建一个表(如果它们不存在的话)。

因此,如何让EF Core自动确保每个ProductType都有一个表,包括以后添加的表?

1 个答案:

答案 0 :(得分:0)

这是EF Core当前不支持的每个类型的表继承模型的示例,您应该考虑切换到支持并可以通过Fluent API进行配置的每个层次模型的表。

https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance