C# 实体框架中表和表继承类型的组合

C# 实体框架中表和表继承类型的组合,c#,entity-framework,database-design,class-table-inheritance,C#,Entity Framework,Database Design,Class Table Inheritance,假设我有一个table+classa,另一个table+classAType代表不同类型的a,还有一个table+classB继承自a B是一种特定类型的a,但它太复杂,无法在数据级别与其他类型的a配合,需要在模式级别有自己的表,当然也需要自己的类 B仍然是a的一种类型,因此我想在AType中有一个表示B的记录,而a中的类型字段实际上是Bs,指向AType中的记录。我还希望能够添加更多从A继承的表+类,并对它们的PK进行硬编码 现在,如果我直接使用SQL,我会为A的继承人创建记录,并将负值作为其

假设我有一个table+class
a
,另一个table+class
AType
代表不同类型的
a
,还有一个table+class
B
继承自
a

B
是一种特定类型的
a
,但它太复杂,无法在数据级别与其他类型的
a
配合,需要在模式级别有自己的表,当然也需要自己的类

B
仍然是
a
的一种类型,因此我想在
AType
中有一个表示
B
的记录,而
a
中的
类型
字段实际上是
B
s,指向
AType
中的记录。我还希望能够添加更多从
A
继承的表+类,并对它们的PK进行硬编码

现在,如果我直接使用SQL,我会为
A
的继承人创建记录,并将负值作为其主键。这样,在数据级别添加的新的
AType
s具有正的PKs,将永远不会与硬编码的架构级别的记录冲突,并且作为一个很好的奖励,我可以轻松地分辨
a
中哪些记录是硬类型的,哪些是软类型的,而无需查看
AType


我不熟悉实体框架,所以在尝试传统方法之前,我不想应用黑客式的解决方案。那么,在实体框架中处理这个问题的惯例是什么呢?

如果您想使用奇怪的方法,您必须手动处理键值-您将获得与SQL相同的结果,但它非常容易出错(特别是由于并发性)。它也不会生成您期望的好SQL,因为EF不会理解隐藏在键值中的逻辑,所以即使您尝试只查询
A
,它将连接所有派生表,以找到哪些记录实际上只是
A
——这就是EF处理TPT继承的方式。

如果您有3种不同的类型,您会怎么做?@podiluska:否定的不是
A
记录的PK,而是
AType
记录的
PK
(当然还有
A
记录中的
type
字段)因此,如果我有3种不同的硬类型,我可以给它们PKs
-1
-2
-3
。我有硬类型PKs的整个负范围-我可以有我想要的任意多个。types表包含数据或元数据还是两者的混合体?@WalterMitty:主要是meatdata,主要是
a
a之间的关系d允许使用其他表格。不过会有一些常规数据,比如类型名称,可能还有一个用于描述的自由文本字段。我知道这个解决方案很粗糙-我描述它是为了帮助描述问题。如果有更常规的方法来做我需要的事情,那将是更好的。