entity-framework - 为什么使用TPC继承时Select查询使用左外连接?

标签 entity-framework entity-framework-4.1

在数据库中,我有 ReservationsOldReservations 表,其中 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 可用于获取 ReservationsOldReservations,并且应该使用 UNION (全部)

关于entity-framework - 为什么使用TPC继承时Select查询使用左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504738/

相关文章:

c# - 在导航属性上定义数据注释

asp.net-mvc - 如何重命名 Entity Framework .edmx 文件

.net - 在EF 4.1中显式加载孙子集合

c# - 在 Entity Framework Core 中重用记录

sql-server-2005 - 多主键与 asp .net mvc 3

c# - 类库中的 Entity Framework 代码优先

c# - 有没有办法在 DBSet 的查询中包含本地缓存的项目?

c# - 在查询中预先加载的动态包含语句 - EF 4.3.1

entity-framework - Entity Framework : join on the rule "A = substring(B)"?

c# - Entity Framework 4.1 Code First - 是否应该初始化许多关系 ICollections