2011-06-27 23 views
2

我遇到了EF 4.1 Code First的一個奇怪問題,即使我已經配置了一個實體爲其繼承屬性生成列,它仍會連接到繼承類型的表。EF Code First:檢索基類型查詢所有派生類型表

這裏是我的課:

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] 

我只希望它來查詢人類表。

+0

你可以包含'LINQ'查詢和完整的'OnModelCreating'方法體。你在使用「每種類型的表」嗎? – Eranga

回答

1

這就是EF的行爲方式。如果查詢Human設置它始終遍歷所有派生表,因爲SuperHuman仍然是Human,並且因爲SuperHuman的實例是查詢的有效結果。

相關問題