2012-02-29 4 views
2

データベースでは、私はReservationsOldReservationsテーブルを持っています。ここで、OldReservationsは(Reservationsテーブルの)コピーであり、古い予約を保存するために使用されます。私は、私は、その後にOldReservationsテーブルのフィールドをマッピングしました
3)OldReservationsエンティティから重複プロパティを削除
2)ReservationsエンティティからOldReservation実体を得なぜTPC継承を使用する場合は、左外部結合を使用してクエリを選択するのですか?

1):ここで私はTPCの継承を作成するためにやった手順は、

しかし、私がfolllowingクエリを実行すると、生成されたSQLはLEFT OUTER JOINを使用して意味がありません。クエリはテーブルのReservations.ReservationID == OldReservations.ReservationIDからの行しか返さないことを意味するためです。

 var reservations = context.Reservations; 
     foreach (var item in reservations); 

生成されたSQL::

SELECT CASE 
     WHEN (NOT (([Project1].[C1] = 1) 
        AND ([Project1].[C1] IS NOT NULL))) THEN '0X' 
     ELSE '0X0X' 
     END       AS [C1], 
     [Extent1].[ReservationID] AS [ReservationID], 
     [Extent1].[ReservationDate] AS [ReservationDate], 
     [Extent1].[ContactID]  AS [ContactID], 
     [Extent1].[EventID]   AS [EventID], 
     [Extent1].[RowVersion]  AS [RowVersion] 
FROM [dbo].[Reservations] AS [Extent1] 
     LEFT OUTER JOIN (SELECT [Extent2].[ReservationID] AS [ReservationID], 
           cast(1 as bit)   AS [C1] 
         FROM [dbo].[OldReservations] AS [Extent2]) AS [Project1] 
     ON [Extent1].[ReservationID] = [Project1].[ReservationID] 

TPC選択クエリ左外側を使用してはdoesnのに参加し、私が読んだ記事からは、上記のクエリは、UNION演算子を使用する必要がありますし、LEFT OUTER JOINをないようです意味が分からないので、TPC継承を作成するときに私は間違って何をしていますか?

ありがとう

+1

これはTPT継承のクエリのようです。 –

+0

申し訳ありませんが、私はあなたの返信に気づいていません。あなたは何を得ているのか分かりません。 – user702769

答えて

2

これはTPCが動作する方法です。 Reservationは具体的なタイプなので、ReservationのプロパティはReservationsテーブルに格納されます。 OldReservationも具体的な型ですので、にまだマップされていないOldReservationのプロパティはOldReservationsテーブルに格納されています。

似ていますが、全く同じではありません。 Reservationを抽象タイプにして、ReservationBaseに名前を変更します。派生型Reservationを作成します。今度はOldReservationは具体的な型から派生しないので、OldReservationのすべてのプロパティと継承されたプロパティはすべてOldReservationsテーブルにマップされます。

その後、yourContext.ReservationBasesを使用してReservationsOldReservationsの両方を取得することができ、UNION (ALL)を使用する必要があります。

+0

ReservationをReservationBaseにリネームしました - >これを抽象タイプに変更 - >派生型Reservation - >作成し、この派生型をReservationsテーブルにマップしました。しかし、今はエラー「EntityTypes BAModel.OldReservation、BAModel.Reservationがテーブル予約の同じ行にマップされています。マッピング条件を使用して、これらの型がマップされている行を区別できます。エラーから、EFがOldReservationsテーブルの代わりにOldReservationエンティティをReservationsテーブルにマップしようとしているようです。マッピング条件を使用する唯一のオプションですか、または回避策がありますか? – user702769

+1

@ user702769あなたの 'OldReservation'はまだ'予約 'から派生していますか?もしそうなら、それは 'ReservationBase'から派生すべきです。 – hvd

+1

@ user702769別の可能性として、 'ReservationBase'がどのテーブルにもマッピングされていないことを確認してください。 'Reservation'と' OldReservation'だけが必要です。 – hvd

関連する問題