我有一个带有 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”的条件组合都不起作用。
有任何想法吗?