我有一个带有TPT映射的EF 4数据模型。 我对生成的查询SQL有一个奇怪的行为。 假设实体A是基础实体,A具有两个派生实体B和C,A也与其他实体(例如E,D)有许多关联。 当我在A,Context.A.First()上做一个简单的选择时,我从这个实体中分析了生成的SQL,并且它与其他实体有所有连接。
你有什么建议为什么会这样?修复?任何提示。
提前致谢...
答案 0 :(得分:1)
Context.A
是所有A
个实体的集合 - 包括所有B
和C
个实体,因为每个B
和C
是 A
。它不是不 A
或B
的所有C
实体的集合。
因此,如果您通过A
请求数据库中的第一个Context.A.First()
,那么可以为B
或C
或仅{ {1}}。要查找第一个A
的具体类型,TPT继承的唯一方法是检查A
或B
表中是否存在与第一个具有相同主键的相关记录记录在C
表中。如果有相关记录,则此A
的类型为A
(或B
),并且表C
(或B
)中记录的所有列值都包含与表C
中的基本记录中的列值一起加载,以实现正确类型A
(或B
)的实体对象。如果表C
或B
中没有相关记录,则具体类型只是C
。
在任何情况下,都需要连接到相关的A
或B
表来确定是否有记录,并确定第一个C
的具体类型。
因此,当您使用TPT继承并且无法避免它们时,您看到的联接是预期的行为。它对性能有负面影响,是的,这是TPT建模的最大缺点。