我有一个带有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”的条件组合都不起作用。
有什么想法吗?
答案 0 :(得分:0)
Welp,我最终放弃尝试通过继承传播鉴别器列,因此我创建了3个视图,一个顶级,一个用于null field1而不是null字段一个,然后在非null字段一个,我制作field2 EF中的鉴别器列。这听起来像是对我的问题的一个糟糕的答案,所以我想听听知道交易是什么的人。标乐?
更新:固定!在我在msdn(http://msdn.microsoft.com/en-us/library/cc716779.aspx)上找到的一篇文章中介绍了横向分区概念。我进入并手动添加了msl中的条件。看起来你无法从设计师那里自动完成这项工作。对于那些想知道的人,在xml编辑器中打开edmx并向下看看映射的条件元素。在需要的地方添加额外条件(显然条件不会从父实体继承,所以你必须手动将它们添加到子节点)并编译!