实体框架 - 实体映射问题

3
我有两个表:地址和联系人,它们通过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的所有关键属性(ContactTest.addressID)指定映射。

当Contact实体中不存在AddressID时,我该如何映射AddressID?我猜我需要某种关联,但我不确定如何处理...请记住,我不想修改现有的Address和Contact实体。
1个回答

4

请记住实体的定义:

一个对象不是由其属性定义的,而是由其连续性和身份定义的。

每个“实体”都必须有某些唯一标识它的东西;即一个关键字。然而,您似乎试图从一个只有一个提供地址的一致标识的关键字的单个物理类型中定义两种类型的实体,但这违反了实体的规则,使得ContactTest概念无效。

由于底层物理类型Test定义了一个关键属性addressID,所有从该类型派生的EntitySet必须将该属性映射到符合定义实体规则的方式。否则,保持状态的一致性是不可能的。


我也遇到了同样的问题,但是我不理解上面的任何内容,是否有一个针对刚接触实体框架的人的通俗易懂的定义?谢谢。 - AlexW
这是对EF早期版本的回答,当时版本为1.0。自那以后已经有了许多变化,所以我不知道现在是否仍然适用,但重点是为了合并地址和联系人,两个实体必须包含相同的键。在OP案例中,Address是具有主键addressID的实体。要直接连接Contact到Address,Contact实体以及其底层表也必须具有addressID。EF可以通过它们的共同键addressID正确关联实体的两个部分。 - jrista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接