2016-06-26 10 views
0

Entity FrameworkのTPCの継承の問題

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

public class ExtendedRow : Row { 
    public int Weight {get;set;} 
} 

のクラスはそれぞれ、独自のビューにマップする必要があり、ExtendedRowビューは、すべての列がありますが表示されます。

私の構成は次のとおりです。

modelBuilder.Entity<Row>().Map(m => { 
     m.MapInheritedProperties(); 
     m.ToTable("Row"); 
    }); 
    modelBuilder.Entity<ExtendedRow >().Map(m => { 
     m.MapInheritedProperties(); 
     m.ToTable("ExtendedRow"); 
    }); 

照会ExtendedRowだけで結構です。しかし、を照会するには、次のSQLを生成します。

SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name] 
     FROM [dbo].[Row] AS [Extent1] 
UNION ALL 
SELECT 
     [Extent2].[Id] AS [Id], 
     [Extent2].[Name] AS [Name] 
     FROM [dbo].[ExtendedRow] AS [Extent2] 

はなぜEFはUNION ALL演算子を追加しますか?どうすれば修正できますか?

答えて

0

は私のために働いたアドバイスhereが見つかりました:

public abstract class RowBase { 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 

public class Row : RowBase { 
} 

public class ExtendedRow : RowBase { 
    public int Weight {get;set;} 
} 

キーはEFがMapInheritedProperties()が使用されている場合、継承ロジックを使用しようとしないようにabstractクラスを持つことです。

1

このトピックに関するスタックオーバーフローにはいくつかの問題があります。
EFはあなたが見るように動作します。あなたがBaseを要求すると、Base(つまりBaseと派生オブジェクト)を実装するすべてのオブジェクトを受け取ります。 TPCを使用すると、UNIONが表示されます。TPHを使用すると、EFがdiscriminatorフィールドのwhere句を省略していることがわかります(つまり、TPCまたはTPHに関係なく結果は常に同じです)。 GetTypeはEFカノニカル関数ではありませんので、使用することはできませんが、EF 6.xで読むことができます(あなたの場合は!(m is ExtendedRow))。実際に私はそれが動作するかわからない。

通常、私はBaseクラスをマップしません(つまり、マップするよりも基底から派生した空のクラスを作成します)。