实体框架4 TPT strang生成SQL查询

时间:2013-11-26 21:54:28

标签: entity-framework entity-framework-4 linq-to-entities

我有一个带有TPT映射的EF 4数据模型。 我对生成的查询SQL有一个奇怪的行为。 假设实体A是基础实体,A具有两个派生实体B和C,A也与其他实体(例如E,D)有许多关联。 当我在A,Context.A.First()上做一个简单的选择时,我从这个实体中分析了生成的SQL,并且它与其他实体有所有连接。

你有什么建议为什么会这样?修复?任何提示。

提前致谢...

1 个答案:

答案 0 :(得分:1)

Context.A是所有A个实体的集合 - 包括所有BC个实体,因为每个BC A。它不是 AB的所有C实体的集合。

因此,如果您通过A请求数据库中的第一个Context.A.First(),那么可以BC或仅{ {1}}。要查找第一个A的具体类型,TPT继承的唯一方法是检查AB表中是否存在与第一个具有相同主键的相关记录记录在C表中。如果有相关记录,则此A的类型为A(或B),并且表C(或B)中记录的所有列值都包含与表C中的基本记录中的列值一起加载,以实现正确类型A(或B)的实体对象。如果表CB中没有相关记录,则具体类型只是C

在任何情况下,都需要连接到相关的AB表来确定是否有记录,并确定第一个C的具体类型。

因此,当您使用TPT继承并且无法避免它们时,您看到的联接是预期的行为。它对性能有负面影响,是的,这是TPT建模的最大缺点。