【问题标题】:TPC inheritance throws an exception on insertsTPC 继承在插入时引发异常
【发布时间】:2012-03-04 01:33:15
【问题描述】:

在数据库中,我有ReservationsOldReservations 表,其中OldReservations 是(Reservations 表的)副本,用于存储旧预订。两个表都使用自动生成的标识键,但第一个的种子为 0,第二个的种子为 1000,因此两个表中的键值不会重叠。以下是我创建 TPC 继承的步骤:

1) 我从Reservation 实体派生了OldReservation 实体 2) 我从OldReservation 实体中删除了重叠属性 3) 然后我在 EDMX 文件的 XML 中映射了 OldReservations 表字段:

      <EntitySetMapping Name="Reservations">
        <EntityTypeMapping TypeName="IsTypeOf(BAModel.Reservation)">
          <MappingFragment StoreEntitySet="Reservations">
            <ScalarProperty Name="ReservationID" ColumnName="ReservationID" />
            <ScalarProperty Name="ReservationDate" ColumnName="ReservationDate" />
            <ScalarProperty Name="EventID" ColumnName="EventID" />
            <ScalarProperty Name="ContactID" ColumnName="ContactID" />
            <ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(BAModel.OldReservation)">
          <MappingFragment StoreEntitySet="OldReservations">
            <ScalarProperty Name="ReservationID" ColumnName="ReservationID" />
            <ScalarProperty Name="ReservationDate" ColumnName="ReservationDate" />
            <ScalarProperty Name="EventID" ColumnName="EventID" />
            <ScalarProperty Name="ContactID" ColumnName="ContactID" />
            <ScalarProperty Name="RowVersion" ColumnName="RowVersion" />
          </MappingFragment>
        </EntityTypeMapping>
      </EntitySetMapping>

完成上述步骤后,项目编译没有任何错误,但是当我尝试在OldReservations 表中插入新行时,我得到:

UpdateException:在多个位置生成跨实体或关联共享的值。检查映射是否不会将 EntityKey 拆分为多个存储生成的列。 ---> System.ArgumentException: 已添加具有相同键的项。

        var reservation = new OldReservation();
        reservation.ReservationDate = DateTime.Now;
        reservation.ContactID = 129;

        context.Reservations.AddObject(reservation);
        context.SaveChanges();

在 EF 设法将插入命令发送到数据库之前引发此异常。任何想法为什么我会得到例外?

谢谢

【问题讨论】:

  • 您的数据库表中是否有自动生成的ReservationID?自动生成是如何定义的?另外,您对用于保存OldReservation 的上下文实例还做了哪些其他操作(加载或存储其他ReservationOldReservation 实例)?
  • 呃,我之前没有注意到你的回复。是的,表使用自动生成的键( Reservations 的种子为 0 而 OldReservations 的种子为 1000 )。我不确定你的意思是我对上下文实例做了哪些其他操作?!如果您的意思是在代码中,那么除了创建一个新的 OldReservation 实体并尝试将其插入到 OldReservations 表中之外,我什么也没做

标签: entity-framework entity-framework-4.1


【解决方案1】:

您收到此异常是因为您使用的是“IsTypeOf(BAModel.Reservation)”,而不仅仅是“BAModel.Reservation”。因此,不仅 BAModel.Reservation,而且从 BAModel.Reservation 派生的类型都映射到 Reservations 表。那么发生的情况是 OldReservation 被映射到 Reservations Table 和 OldReservations Table。

【讨论】:

  • 我不确定这是否属实,因为即使我将(在 MSL 中)条目“TypeName=IsTypeOf(BAModel.OldReservation)”替换为“TypeName=BAModel.OldReservation”,我仍然得到相同的结果异常(我无法将“TypeName=IsTypeOf(BAModel.Reservation)”替换为“TypeName=BAModel.Reservation”,因为我遇到了异常)。
猜你喜欢
  • 2010-11-07
  • 2011-03-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2014-01-20
  • 2012-10-19
  • 2018-10-09
相关资源
最近更新 更多