2011-06-27 14 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'メソッド本体を含めることができます。 'Table per Type'を使用していますか? – Eranga

答えて

1

これはEFの動作です。 Humanを照会すると、SuperHumanがまだHumanであり、そのインスタンスがSuperHumanであるため、すべての派生テーブルは常に人間のための有効な照会結果であるため、常に派生したすべての表にまたがります。

関連する問題