将asp.net核心实体框架核心中的继承类强制到专用的mysql表

c2e8gylq  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(340)

有模特儿 Thread 应该计算另一个模型的所有属性 Post 我使用继承:

class Post {
    public int Id{get;set;}
    public string Title{get;set;}
    // ...
}
class Thread: Post {
    public int ForumId{get;set;}
    // ...
}

ef core将两者放在一个表中并添加列 Discriminator . 它包含类的名称,以便.net core可以将其序列化为正确的类型。
我的目标是:
Post 所有属性 Post 模型
Thread 使用模型中的所有属性 Thread 以及 Post ####为什么?
我假设这两个表在未来都会大量增长
因为表定义包含 Thread 总是空的 Post
从开发人员的Angular 来看,它看起来并不干净和正确

我已经试过了

创建两个不同的 DbSet<T> 在我的 DbContext 为了 Post 以及 Thread 添加 builder.Entity<Post>().ToTable("Post")OnModelCreating 对于每个实体
使用 [Table("Post")] 类定义上的装饰器
将共享属性移动到抽象的chass并让 Post 以及 Thread 从中继承

某种解决方法

最后一个有效:

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

但这会在链接实体时产生问题。

pdtvr36n

pdtvr36n1#

您所描述的是所谓的tpc,或表每具体类型,关系模式,目前不支持在实体框架核心。你可以关注这里的相关问题。
这个特性目前还没有里程碑,所以如果您必须执行tpc,那么您唯一的选择就是使用ef6或其他支持这个关系策略的替代orm,而不是ef core。
就我个人而言,我建议坚持使用efcore,只使用tph(每个层次的表)或tpt(每个类型的表)关系策略。前者实际上是默认值,并将为两者生成一个表,其中 Discriminator 表示实际类型的列。后者是您使用 ToTable fluent配置或 [Table] 属性,并生成一个包含所有共享属性的基类型表,然后生成一个包含每个派生类型的表,只包含该类型的属性,并将外键返回到基类型的表。post和线程之间有很强的关系,在数据库级别维护这种关系是有价值的。

相关问题