0

我有一个带有 int PK、一个 NOT NULL 字段和两个 NULL 字符串字段的表。

当我在 EF 中设置 TPH 风格的设计时,我是这样设置的:

顶级类型只有 PK 和 NOT NULL 字段。

第一级检查第一个可为空的字段作为鉴别器。not null 结果类型是抽象的。我相应地映射了该字段。

我对第二个字段再次执行此操作,再次映射不为空的位置。我在我映射的字段上设置了 nullable = false。

<EntitySetMapping Name="Items">
        <EntityTypeMapping TypeName="IsTypeOf(Model1.Item)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name="OtherID" ColumnName="OtherID" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.BothNullItem)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="FirstNullField" IsNull="true" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.FirstFieldNull)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name=FirstNullField" ColumnName="FirstNullField" />
            <Condition ColumnName="FirstNullField" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem1)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem2)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
             <ScalarProperty Name="NullField2" ColumnName="NullField2" />
             <Condition ColumnName="NullField2" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
</EntitySetMapping>

我得到“具有不同键的两个实体映射到同一行。”

我在想这是因为第一项的 not null 属性可能没有被孩子继承。

我创建了第三种类型来尝试处理 NullField1 为 null 而 NullField2 不为 null 的情况(这在我的数据库中不会发生,我有一个约束),但即使我添加了它也不起作用.

在 2 个子子项中的任何一个上显式添加非空条件需要我映射列,即使我将其映射到一些无关的属性,它仍然不起作用。

“BothNullItem”的条件组合都不起作用。

有任何想法吗?

4

1 回答 1

0

好吧,我最终放弃了尝试让鉴别器列通过继承传播,所以我创建了 3 个视图,一个顶级视图,一个用于空字段 1 而不是空字段一,然后在非空字段一上,我将字段 2 设置为鉴别器EF 中的列。这听起来像是对我的问题的糟糕答案,所以我想听听知情人士的意见。比勒?

更新:已修复!在我在 msdn (http://msdn.microsoft.com/en-us/library/cc716779.aspx) 上找到的一篇文章中脱离了水平分区概念,我进入并在 msl 中手动添加了条件。看起来你不能从设计师那里自动获得这项工作。对于那些想知道的人,请在 xml 编辑器中打开 edmx,然后向下查看映射的条件元素。在需要的地方添加额外的条件(显然条件不是从父实体继承的,所以你必须手动将它们添加到子实体中)并编译!

于 2011-06-11T02:51:41.950 回答