2012-02-29 33 views
0

在數據庫中,我有ReservationsOldReservations表,其中OldReservations是副本(表的Reservations),用於存儲舊保留。兩個表都使用自動生成的身份密鑰,但首先有一個種子爲0,第二個種子爲1000,因此兩個表中的鍵值不重疊。下面是我做來創建TPC繼承以下步驟:TPC繼承在插入時拋出異常

1)I衍生OldReservation實體從實體Reservation 2)I從OldReservation實體 3除去重疊屬性)我然後被映射在XML中OldReservations表中的字段在EDMX文件:

 <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之前拋出設法發送命令插入到數據庫。任何想法,爲什麼我得到例外?

謝謝

+1

你的數據庫表中是否有自動生成的'ReservationID'?如何定義自動生成?你還有什麼其他的操作在上下文實例中用來保存'OldReservation'(加載或存儲其他'Reservation'和'OldReservation'實例)? – 2012-03-01 09:31:52

+0

呃,我以前沒有注意到你的回覆。是的,表格使用自動生成的鍵(預訂的種子爲0,OldReservations的種子爲1000)。我不確定你的意思是我在上下文實例上做了哪些其他操作?如果你的意思是在代碼中,那麼除了創建一個新的OldReservation實體並試圖將其插入到OldReservations表中 – user702769 2012-03-01 20:34:22

回答

0

你,因爲你使用「IsTypeOf(BAModel.Reservation)」,而不僅僅是「BAModel.Reservation」得到這個例外。由於這不僅僅是BAModel.Reservation,而且來自BAModel.Reservation的類型也被映射到保留表。所以會發生什麼是一個OldReservation被映射到保留表和OldReservations表。

+0

我不確定這是否爲真,因爲即使我替換(在MSL中)條目「TypeName = IsTypeOf(BAModel.OldReservation)「與」TypeName = BAModel.OldReservation「我仍然得到相同的異常(我不能用」TypeName = BAModel.Reservation「替換」TypeName = IsTypeOf(BAModel.Reservation)「,因爲我得到一個例外)。 – user702769 2012-03-06 13:12:05