在数据库中,我有 Reservations
和 OldReservations
表,其中 OldReservations 是( Reservations
表)的副本,用于存储旧的预订。以下是我创建 TPC 继承的步骤:
1) 我从 Reservations
实体派生 OldReservation
实体
2) 我从 OldReservations
实体中删除了重叠的属性
3) 然后,我将 OldReservations
表字段映射到 EDMX 文件的 XML 中
但是当我运行以下查询时,生成的 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 继承时我做错了什么?
谢谢
最佳答案
这就是 TPC 应该如何工作的。 Reservation
是具体类型,因此 Reservation
中的属性存储在 Reservations
表中。 OldReservation
也是具体类型,因此 OldReservation
中尚未映射的属性存储在 OldReservations
中> 表。
你想要的很相似,但不完全相同。将 Reservation
设为抽象类型并将其重命名为 ReservationBase
。然后创建一个派生类型Reservation
。现在,OldReservation
不再派生自具体类型,因此所有 OldReservation
自己的属性和继承的属性都将映射到 OldReservations 表。
之后,yourContext.ReservationBases
可用于获取 Reservations
和 OldReservations
,并且应该使用 UNION (全部)
。
关于entity-framework - 为什么使用TPC继承时Select查询使用左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504738/