EF Code First: получение базового типа запрашивает все таблицы производных типов - PullRequest
2 голосов
/ 28 июня 2011

У меня странная проблема с кодом EF 4.1. Во-первых, даже несмотря на то, что я настроил сущность для генерации столбцов для своих унаследованных свойств, он все равно присоединяется к таблице унаследованного типа.

Вот мои классы:

public class Human
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class SuperHuman : Human
{
    public int Id { get; set; }
    public string Powers { get; set; }
}


public class MarvelDbContext : DbContext
{
    public DbSet<Human> Humans { get; set; }
    public DbSet<SuperHuman> SuperHumans { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SuperHuman>().Map(m => m.MapInheritedProperties());
    }
}

Вот результирующий запрос:

    SELECT 
[Limit1].[C3] AS [C1], 
[Limit1].[C1] AS [C2], 
[Limit1].[C2] AS [C3], 
[Limit1].[C4] AS [C4]
FROM ( SELECT TOP (1) 
    [UnionAll1].[Id] AS [C1], 
    [UnionAll1].[Name] AS [C2], 
    CASE WHEN ([UnionAll1].[C2] = 1) THEN '0X' ELSE '0X0X' END AS [C3], 
    CASE WHEN ([UnionAll1].[C2] = 1) THEN CAST(NULL AS varchar(1)) ELSE [UnionAll1].[C1] END AS [C4]
    FROM  (SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Name] AS [Name], 
        CAST(NULL AS varchar(1)) AS [C1], 
        cast(1 as bit) AS [C2]
        FROM [dbo].[Humen] AS [Extent1]
    UNION ALL
        SELECT 
        [Extent2].[Id] AS [Id], 
        [Extent2].[Name] AS [Name], 
        [Extent2].[Powers] AS [Powers], 
        cast(0 as bit) AS [C1]
        FROM [dbo].[SuperHumans] AS [Extent2]) AS [UnionAll1]
)  AS [Limit1]

Я хочу, чтобы он только запрашивал таблицу людей.

1 Ответ

1 голос
/ 28 июня 2011

Так ведет себя EF. Если вы запрашиваете Human set, он всегда распространяется и на все производные таблицы, потому что SuperHuman по-прежнему Human, и поэтому экземпляры SuperHuman являются действительными результатами запроса для людей.

...