2016-06-26 8 views
0

Ich möchte in meiner Anwendung Tabelle Pro Betontyp Erbe haben:Entity Framework TPC Erbe Ausgabe

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

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

Jede der Klassen, um ihre eigene Sicht abgebildet werden müssen und ExtendedRow Ansicht hat alle Spalten Ansicht.

Meine Konfiguration ist:

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

Abfragen ExtendedRow ganz gut ist. Allerdings Abfrage generiert die folgende 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] 

Warum fügen EF UNION ALL Operator? Wie repariere ich es?

Antwort

0

einen Rat here gefunden, die für mich gearbeitet:

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;} 
} 

Der Schlüssel ist eine abstract Klasse haben, so dass EF nicht versuchen, Vererbungslogik zu verwenden, wenn MapInheritedProperties() verwendet wird.

1

Es gibt mehrere Probleme beim Stack-Überlauf zu diesem Thema.
EF funktioniert so, wie Sie sehen, wenn Sie nach Base fragen, erhalten Sie alle Objekte, die Base (d. H. Base und abgeleitete Objekte) implementieren. Wenn Sie TPC verwenden, sehen Sie UNION, wenn Sie TPH verwenden, sehen Sie, dass EF die where-Klausel im Diskriminatorfeld auslässt (d. H. Es spielt keine Rolle, ob TPC oder TPH, das Ergebnis ist immer dasselbe). GetType ist keine EF kanonische Funktion, so dass Sie es nicht verwenden können, aber ich habe gelesen, dass mit EF 6.x Sie (in Ihrem Fall !(m is ExtendedRow)) verwenden können. Eigentlich weiß ich nicht ob es funktioniert.

Normalerweise binde ich keine Basisklasse (d. H. Ich mache eine leere Klasse, die von der Basis abgeleitet ist, als ich sie abbilde).