【发布时间】:2012-03-04 01:33:15
【问题描述】:
在数据库中,我有Reservations 和OldReservations 表,其中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的上下文实例还做了哪些其他操作(加载或存储其他Reservation和OldReservation实例)? -
呃,我之前没有注意到你的回复。是的,表使用自动生成的键( Reservations 的种子为 0 而 OldReservations 的种子为 1000 )。我不确定你的意思是我对上下文实例做了哪些其他操作?!如果您的意思是在代码中,那么除了创建一个新的 OldReservation 实体并尝试将其插入到 OldReservations 表中之外,我什么也没做
标签: entity-framework entity-framework-4.1