使用TPC继承的原因是使用左外连接选择查询?

时间:2012-02-29 18:38:50

标签: entity-framework entity-framework-4.1

在数据库中,我有ReservationsOldReservations个表,其中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继承时我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:2)

这就是TPC的运作方式。 Reservation是具体类型,因此Reservation中的属性存储在Reservations表中。 OldReservation也是具体类型,因此OldReservation 中尚未映射的属性存储在OldReservations表中。

你想要的是相似的,但不完全相同。将Reservation设为抽象类型,并将其重命名为ReservationBase。然后创建派生类型Reservation。现在OldReservation不再从具体类型派生,因此所有OldReservation自己的属性和继承的属性都将映射到OldReservations表。

之后,yourContext.ReservationBases可用于同时获取ReservationsOldReservations,并且应使用UNION (ALL)