如何使用从抽象类继承的字段为每个实体创建一个额外的表

时间:2019-04-04 22:14:33

标签: c# asp.net-core entity-framework-core ef-core-2.2

我想为每个实体创建2个表:一个具有原始属性,另一个具有相同的字段以及从抽象类继承的字段。

例如:

实体类(产品):

  • 说明
  • 类别
  • 库存

抽象类:

  • UpdatedBy
  • UpdatedAt

我期望的结果是:

餐桌产品:

  • 说明
  • 类别
  • 库存

餐桌产品_摘要:

  • 说明
  • 类别
  • 库存
  • UpdatedBy
  • UpdatedAt

我要避免的是创建一个继承每个实体抽象的类,因为我不会在项目中使用它。我只需要创建具有迁移功能的表,因此,如果将来更新Product并添加新的迁移,则两个表都应进行更改。

我认为我正在寻找这样的东西

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .Map(m => m.ToTable("Products"))
        .Map<AbstractClass>(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Products_Abstract");
        });
}

但是此代码用于EF6,我使用的是EF Core,但无法更改它。

先谢谢了。英语不是我的主要语言,希望您能理解。

1 个答案:

答案 0 :(得分:0)

要使用两个模型创建表,可以尝试如下操作:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<Product> Product { get; set; }       

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        foreach (var property in typeof(Product).GetProperties())
        {
            builder.Entity<Products_Abstract>()
                   .Property(property.PropertyType, property.Name);
        }
    }
}

更新:

public class Abstract
{
    public string UpdatedBy { get; set; }
    public string UpdatedAt { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    foreach (var property in typeof(Product).GetProperties())
    {
        builder.Entity<Abstract>()
                .ToTable("Products_Abstract")
                .Property(property.PropertyType, property.Name);
    }
}