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# - 为什么使用 EF/Linq to sql 创建性能不佳的查询如此容易

c# - EF 6 关系 : One or more validation errors were detected during model generation

c# - Entity Framework 4.1 和父/子关系的存储库模式

asp.net-mvc-3 - Entity Framework 4.1 代码优先的 SQL Server 2008 连接字符串

sql-server-ce - 系统.Data.SqlServerCe.Entity.dll

asp.net-mvc - 如何使用启用了延迟加载的 Automapper 和 EF4 DbContext 从 ViewModel 更新现有实体

c# - Entity Framework - 包括多个级别的属性

c# - LINQ 查询其中 ID 不作为对象列表中的属性存在

database - Entity Framework 代码优先数据库中的默认数据

null - 使用 Entity Framework 4.1 Code First 时,当数据库中为 null 时,默认 bool 为 false