在数据库中,我有Reservations
和OldReservations
个表,其中OldReservations是(Reservations
表的)副本,用于存储旧保留。以下是我创建TPC继承的步骤:
1)我从OldReservation
实体中派生了Reservations
个实体
2)我从OldReservations
实体中删除了重叠属性
3)然后我在EDMX文件的XML中映射了OldReservations
表字段
但是当我运行以下查询时,生成的sql使用LEFT OUTER JOIN,这没有意义,因为这意味着查询只返回OldReservations
表中Reservations.ReservationID == OldReservations.ReservationID
的行。从我读过的文章看来,上面的查询似乎应该使用UNION运算符而不是LEFT OUTER JOIN:
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选择查询没有意义,所以在创建TPC继承时我做错了什么?
谢谢
答案 0 :(得分:2)
这就是TPC的运作方式。 Reservation
是具体类型,因此Reservation
中的属性存储在Reservations
表中。 OldReservation
也是具体类型,因此OldReservation
中尚未映射的属性存储在OldReservations
表中。
你想要的是相似的,但不完全相同。将Reservation
设为抽象类型,并将其重命名为ReservationBase
。然后创建派生类型Reservation
。现在OldReservation
不再从具体类型派生,因此所有OldReservation
自己的属性和继承的属性都将映射到OldReservations表。
之后,yourContext.ReservationBases
可用于同时获取Reservations
和OldReservations
,并且应使用UNION (ALL)
。