【问题标题】:What table per type inheritance behaviors每个类型继承行为的表
【发布时间】:2012-05-12 18:21:19
【问题描述】:

给定两个实体:父、子。

每个类型继承的表在以下情况下会做什么:

  1. 您添加了一个名为 Child 的实体,其所有值均留空,但已填写其 Parent 属性。它会添加子实体还是仅添加父实体?

  2. 如果 ID == id 的实体 Parent 存在,但它没有 Child,是否会针对具有谓词 ID == id 的存储库 Child 的查询返回任何内容? IE。这样的查询会被翻译成左连接还是交叉连接?

【问题讨论】:

    标签: c# .net entity-framework orm


    【解决方案1】:
    1. 它总是会尝试在两个表中添加一个条目

    2. EF 不会返回任何内容。生成的 SQL 是左连接

    【讨论】:

    • 如果是左连接,那么它应该返回子表,因为父表中的父表存在,而子表不存在。对吗?
    • 如果子项不存在,则无法返回子项。它产生类似于 SELECT ... FROM Children LEFT JOIN Parents ON ChildId = ParentId WHERE ChildId = @Id 的内容。如果 ChildId 不存在,则返回一个空结果
    • 这很棘手,但信息量很大。在我的情况下,子 PK 实际上也是父实体的 FK。我想知道这是否仍然存在。
    【解决方案2】:
    1. 你认为 EF 会检查子实体,如果所有属性都可以为空,如果是,那么它不会保存它?为什么会那样做??此外,层次映射是规则,如果实体是子类型,那么它必须在子表中有记录。所以答案可能是否定的。即使子项没有设置属性,它仍然会在表中创建记录。

    2. 当实体还没有机会查询其类型时,EF 如何判断实体是否为父类型?所以不,每次都会生成join。

    【讨论】:

    • 说实话,我不知道。但我相信左连接就足够了。自己做一个测试示例,看看生成了什么 SQL 应该不难。
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多