2010-06-29 214 views
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> 

在我的CS映射:

<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> 

我收到的错误是:

映射片段中的问题从l处开始 ine 150:必须指定 EntitySet ContactTest的 (ContactTest.addressID)的所有关键属性 的映射。

我该如何在Contact实体中映射一个AddressID,当它不在该实体中时?我想我需要某种联系,但我不确定如何去解决它...请记住,我不想修改我现有的地址和联系人实体。

回答

4

记住一个实体的定义:

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

每个“实体”都必须有一些东西来唯一标识它;关键。但是,您似乎试图从单一物理类型中定义两种类型的实体,其中只有一个密钥为地址提供一致的身份,而不是联系人。这违反了实体的规则,使ContactTest概念失效。

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

+0

我有这个相同的问题,但我不明白上述任何,是否有一个新的实体框架的人拉曼定义?谢谢 – AlexW 2013-07-16 08:51:50

+0

好吧,这是在1.0天内回复EF的老版本。自那时以来有很多机会,所以我不知道这是否仍然适用,但重点是为了结合地址和联系人,两个实体必须包含相同的密钥。在OP的情况下,Address是具有主键addressID的实体。要将联系人直接连接到地址,联系人实体及其基础表必须具有地址ID。 EF然后可以通过它们的公共密钥... addressID正确地关联实体的两半。 – jrista 2013-07-16 19:41:23