C# 实体框架中表和表继承类型的组合
假设我有一个table+classC# 实体框架中表和表继承类型的组合,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的继承人创建记录,并将负值作为其
a
,另一个table+classAType
代表不同类型的a
,还有一个table+classB
继承自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允许使用其他表格。不过会有一些常规数据,比如类型名称,可能还有一个用于描述的自由文本字段。我知道这个解决方案很粗糙-我描述它是为了帮助描述问题。如果有更常规的方法来做我需要的事情,那将是更好的。