问题描述
||
我有一个带有int PK,一个NOT NULL字段和两个NULL字符串字段的表。
当我在EF中设置TPH风格的设计时,我是这样设置的:
顶级类型仅具有PK和NOT NULL字段。
第一级将第一个可为空的字段检查为鉴别符。结果为非null的类型是abstract。我相应地映射该字段。
我对第二个字段再次执行此操作,再次映射不为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为null和NullField2不为null的情况(这在我的数据库中不会发生,我有一个约束),但是即使我添加了它也不会\'工作。
在2个子孩子中的任何一个上显式添加not null条件需要我映射该列,即使我将其映射到一些无关的属性上也仍然行不通。
\“ BothNullItem \”的条件组合均无效。
有任何想法吗?
解决方法
遗憾的是,我最终放弃了尝试让鉴别符列通过继承进行传播,因此我创建了3个视图,一个顶层,一个用于null字段1和非null字段1,然后在非null字段1上,我使field2成为鉴别符EF中的列。这听起来像是对我的问题的cr脚回答,所以我想听听某人的消息,以了解这笔交易是什么。布勒?
更新:已修复!我在msdn(http://msdn.microsoft.com/zh-cn/library/cc716779.aspx)上找到的一篇文章中讲解了水平分区的概念,然后我在msl中手动添加了条件。看来您无法从设计者那里自动进行这项工作。对于那些想知道的人,请在xml编辑器中打开edmx,然后向下查看映射的conditions元素。在需要的地方添加其他条件(显然条件不是从父实体继承的,因此您必须手动将其添加到子实体)并进行编译!