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