C# 将ASP.NET核心实体框架核心中的继承类强制到专用MySQL表

C# 将ASP.NET核心实体框架核心中的继承类强制到专用MySQL表,c#,mysql,asp.net-core,ef-code-first,entity-framework-core,C#,Mysql,Asp.net Core,Ef Code First,Entity Framework Core,拥有一个模型线程,该线程应该计算另一个名为Post的模型的所有属性,我使用继承: class Post { public int Id{get;set;} public string Title{get;set;} // ... } class Thread: Post { public int ForumId{get;set;} // ... } EF Core将两者都放在一个表中,并添加列鉴别器。它包含类的名称,因此.NET Core可以将其序列化为

拥有一个模型
线程
,该线程应该计算另一个名为
Post
的模型的所有属性,我使用继承:

class Post {
    public int Id{get;set;}
    public string Title{get;set;}
    // ...
}
class Thread: Post {
    public int ForumId{get;set;}
    // ...
}
EF Core将两者都放在一个表中,并添加列
鉴别器
。它包含类的名称,因此.NET Core可以将其序列化为正确的类型

我的目标是:

  • Post
    ,包含
    Post
    模型的所有属性
  • Thread
    ,包含模型
    Thread
    Post
为什么?
  • 我假设这两张表在未来都会大幅增长
  • 因为表定义包含
    Thread
    中的行,这些行在
    Post
    行上总是空的,所以它会放大我的数据库
  • 从开发人员的角度来看,它看起来并不干净和正确
  • 我已经试过了
    • 在my
      DbContext中为
      Post
      线程创建两个不同的
      DbSet
    • 在每个实体的
      OnModelCreating
      中添加
      builder.Entity().ToTable(“Post”)
    • 在类定义上使用
      [Table(“Post”)]
      装饰器
    • 将共享属性移动到抽象chas,并让
      Post
      Thread
      从中继承
    某种解决办法 最后一个有效:

    class Content {
        // Shared Attributes like Title
    }
    class Post: Content {}
    class Thread: Content {}
    

    但这会在链接实体时引起问题

    您所描述的被称为TPC,或每种具体类型的表,关系模式,目前在实体框架核心中不受支持。你可以跟着我走

    这个特性目前还没有里程碑,所以如果您必须执行TPC,那么您唯一的选择就是使用EF6或其他支持此关系策略的替代ORM,而不是EF Core


    就个人而言,我建议坚持使用EF Core,只使用TPH(每个层次的表)或TPT(每个类型的表)关系策略。前者实际上是默认值,并将为两者生成一个单独的表,其中有一个
    鉴别器
    列指示实际类型。后者是当您使用
    ToTable
    fluent配置或
    [Table]
    属性时得到的,结果是基类型的表包含所有共享属性,然后是每个派生类型的表,仅包含该类型的属性,并将外键返回到基类型的表。post和线程之间有很强的关系,实际上在数据库级别维护这种关系是有价值的。

    您所描述的被称为TPC,或每种具体类型的表,关系模式,目前在实体框架核心中不受支持。你可以跟着我走

    这个特性目前还没有里程碑,所以如果您必须执行TPC,那么您唯一的选择就是使用EF6或其他支持此关系策略的替代ORM,而不是EF Core


    就个人而言,我建议坚持使用EF Core,只使用TPH(每个层次的表)或TPT(每个类型的表)关系策略。前者实际上是默认值,并将为两者生成一个单独的表,其中有一个
    鉴别器
    列指示实际类型。后者是当您使用
    ToTable
    fluent配置或
    [Table]
    属性时得到的,结果是基类型的表包含所有共享属性,然后是每个派生类型的表,仅包含该类型的属性,并将外键返回到基类型的表。帖子和线程之间有着很强的关系,在数据库级别维护这种关系是有价值的。

    这个问题现在有了
    考虑下一个版本的标签,从11月13日开始,但自发布此答案以来,没有任何重大变化。截至11月13日,本期已贴上“考虑下一版本”
    标签,但自发布此答案以来,没有任何重大变化。