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日,本期已贴上“考虑下一版本”
标签,但自发布此答案以来,没有任何重大变化。