我有两个表:地址和联系人,它们通过contactID(联系人)加入。这两个表都有我的实体数据模型(EF 4.0)中的实体,我不想修改它们。
我确实想要创建一个包含两个实体信息的新实体。
到目前为止我做了什么:
在CSDL中:
<EntityContainer...>
<EntitySet Name="AddressTest" EntityType="WebGearsModel.Test" />
<EntitySet Name="ContactTest" EntityType="WebGearsModel.Test" />
</EntityContainer>
<EntityType Name="Test">
<Key>
<PropertyRef Name="addressID" />
</Key>
<Property Type="Int32" Name="addressID" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Type="Int32" Name="contactID" Nullable="false" />
<Property Type="String" Name="firstName" Nullable="false" MaxLength="30" FixedLength="false" Unicode="false" />
<Property Type="String" Name="emailAddress" Nullable="false" MaxLength="150" FixedLength="false" Unicode="false" />
</EntityType>
在我的C-S映射中:
<EntitySetMapping Name="AddressTest">
<EntityTypeMapping TypeName="WebGearsModel.Test">
<MappingFragment StoreEntitySet="Address">
<ScalarProperty Name="addressID" ColumnName="addressID" />
<ScalarProperty Name="contactID" ColumnName="contactID" />
<ScalarProperty Name="firstName" ColumnName="firstName" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="ContactTest">
<EntityTypeMapping TypeName="WebGearsModel.Test">
<MappingFragment StoreEntitySet="Contact">
<ScalarProperty Name="contactID" ColumnName="contactID" />
<ScalarProperty Name="emailAddress" ColumnName="emailAddress" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
我收到的错误是:
映射片段开始出现问题 在第150行:必须指定映射 所有关键属性 (ContactTest.addressID)的 EntitySet ContactTest。
如果在该实体中不存在AddressID,我应该如何从Contact实体映射AddressID?我想我需要某种关联,但我不确定如何去做...记住,我不想修改我现有的地址和联系人实体。
答案 0 :(得分:4)
记住实体的定义:
未定义的对象 属性,而不是一个线程 连续性及其身份。
每个“实体”必须具有唯一标识它的东西;关键。但是,您似乎尝试从单个物理类型定义两种类型的实体,这些物理类型只有一个键,为地址提供一致的标识,但不提供联系人。这违反了实体的规则,使ContactTest概念无效。
由于基础物理类型Test
定义了一个键属性addressID
,因此从该类型派生的所有EntitySet必须映射该属性以符合定义实体的规则。否则就不可能保持国家的一致性。