错误3033:映射片段中的Prblm:EntitySets的Entity1'和'Entity2'都映射到表'Addresses'。他们的主键可能会发生碰撞

时间:2013-08-23 19:51:40

标签: entity-framework

上下文。我想将一个发货表分成两个表,第一个用于关于最常用的发货的一般数据,在第二个表中用于将拾取和目的地地址存储在具有选择器字段RecordType的不同记录中,以便检索仅在需要时才提供地址信息。为此,我创建了三个实体,实体Move用于运输一般信息,实体提取地址和实体目的地地址,最后两个实体有一个附加字段“地址类型”,以区分哪个是拾取,哪个是目的地。 使用模型中的映射详细信息屏幕,我将两个实体,PickupAddress和DestinationAddress映射到同一个表MoveAddresses,具有codition recordtype =“P”的PickupAddress和具有条件recordtype =“D”的DestinationAddress。 当我重建数据层解决方案时,我遇到了以下错误

Error   2   Error 3032: Problem in mapping fragments starting at line 625: Condition member 'MoveAddresses.AddressType' with a condition other than 'IsNull=False' is mapped. Either remove the condition on DestinationAddresses.AddressType or remove it from the mapping.

Error   4   Error 3033: Problem in mapping fragments starting at line 647: EntitySets 'PickupAddresses' and 'DestinationAddresses' are both mapped to table 'MoveAddresses'. Their primary keys may collide.

1 个答案:

答案 0 :(得分:0)

您要实现的是每个层次结构的表。根据您的描述,听起来您正在使用Entity Framework Designer表面。在Entity Framework Designer中为每个Hiearchy建模表是一个多步骤过程。

  1. 创建一个实体,它代表将保存多个绑定实体的表(在您的情况下,创建一个Address实体,其中Addresses实体设置,匹配整个地址表)。暂时忘掉Move表,你现在只关心表共享数据。
  2. 右键单击设计器表面,添加 - >实体,将每个派生条目的基本类型设置为Address,即PickupAddress派生自Address
  3. 剪切并粘贴属于每个派生实体的任何特定条目,将它们从基础实体中删除并将它们粘贴到派生实体中。即pickup date已从Address移至PickupAddress
  4. 从基础实体中删除Descriminator属性。它实际上不是可以由实体直接使用的属性。
  5. 右键单击每个派生实体,选择表映射。选择映射的基表,并设置鉴别器值。
  6. 现在,您已准备好根据需要在派生类和其他表之间创建实体关系。