具有多个可为空的鉴别符的EF 4.1中的每个层次结构布局问题的表

时间:2011-06-09 23:20:46

标签: entity-framework frameworks entity entity-framework-4.1 table-per-hierarchy

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

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

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

第一级将第一个可空字段检查为鉴别符。非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>

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

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

我已经创建了第三种类型来尝试处理NullField1为空并且NullField2不为空的情况(这在我的数据库中不会发生,我有一个约束),但即使我添加了它也没有不行。

在2个子子项中的任何一个上显式添加非空条件都需要我映射列,即使我将其映射到某个无关的属性,该列仍然无效。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Welp,我最终放弃尝试通过继承传播鉴别器列,因此我创建了3个视图,一个顶级,一个用于null field1而不是null字段一个,然后在非null字段一个,我制作field2 EF中的鉴别器列。这听起来像是对我的问题的一个糟糕的答案,所以我想听听知道交易是什么的人。标乐?

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