2017-01-05 5 views
0

みなさんこんにちは、幸せな新しい2017年、EF6:SQL Serverで、ネストされたTPH構造上に含める

I以下のテーブル - /オブジェクトの構造を有しています。

[Table("Table1")] 
public class Table1 
{ 
    [Key] 
    public long Table1Id { get; set; } 

    public virtual ICollection<Table2> ItemsOfTable2 { get; set; } 
} 

[Table("Table2")] 
public class Table2 
{ 
    [Key] 
    public long Table2Id { get; set; } 

    public long Table1Id { get; set; } 

    [ForeignKey("Table1Id")] 
    public virtual Table1 Table1Object { get; set; } 

    public virtual ICollection<Table3Base> ItemsOfTable3 { get; set; } 

    [NotMapped] 
    public virtual ICollection<Table3Red> RedItems 
    { 
     get { return this.ItemsOfTable3.OfType<Table3Red>().ToList(); } 
    } 

    [NotMapped] 
    public virtual ICollection<Table3Blue> BlueItems 
    { 
     get { return this.ItemsOfTable3.OfType<Table3Blue>().ToList(); } 
    } 
} 

[Table("Table3Base")] 
public abstract class Table3Base 
{ 
    [Key] 
    public long Table3Id { get; set; } 

    public long Table2Id { get; set; } 

    [ForeignKey("Table2Id")] 
    public virtual Table2 Table2Object { get; set; } 
} 

public class Table3Red : Table3Base 
{ 
    public string SpecialPropertyForRed { get; set; } 
} 

public class Table3Blue : Table3Base 
{ 
    public int SpecialPropertyForBlue { get; set; } 

    public virtual ICollection<Table4> ItemsOfTable4 { get; set; } 
} 

[Table("Table4")] 
public class Table4 
{ 
    [Key] 
    public long Table4Id { get; set; } 

    public long Table3Id { get; set; } 

    [ForeignKey("Table3Id")] 
    public virtual Table3Blue Table3BlueObject { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public virtual IDbSet<Table1> Table1DbSet { get; set; } 
    public virtual IDbSet<Table2> Table2DbSet { get; set; } 
    public virtual IDbSet<Table3Red> Table3RedDbSet { get; set; } 
    public virtual IDbSet<Table3Blue> Table3BlueDbSet { get; set; } 
    public virtual IDbSet<Table4> Table4DbSet { get; set; } 
} 

したがって、この "木" の途中で、TPH構造(データベーステーブルに格納されているクラスTable3Base、Table3Red、Table3Blue "Table3Base")があります。 Table3RedとTable3BlueにはIDbSetsしかありません。Table3BaseではIDbSetはありません。すべてのオブジェクトには、次のテーブルオブジェクトのコレクションナビゲーションプロパティがあります。

クラスTable3Blueには、Table4オブジェクトの項目に対する別のコレクションナビゲーションプロパティがあります。

としてさらに(うまくいけば、無関係な)情報:デフォルトの弁別器は、内部列挙にマッピングされている:一つによって一つ一つのレコード1をロードする(これにより、パフォーマンスの問題に

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

    // TPH: Map Standard-Discriminator to Enum 
    modelBuilder.Entity<Table3Base>() 
     .Map<Table3Red>(m => m.Requires("Typ").HasValue((int)Table3TypEnum.Red)) 
     .Map<Table3Blue>(m => m.Requires("Typ").HasValue((int)Table3TypEnum.Blue)); 
} 

非常に遅い、遅延ロードがアクティブであります第1および第2の「インクルードパス式が参照しなければならない引数の例外がスローされます動作するようには思えますが、第三には、含まれ

var table1Records = this.m_Context.Table1DbSet 
    .Include(t => t.ItemsOfTable2) 
    .Include(t => t.ItemsOfTable2.Select(t2 => t2.ItemsOfTable3)) 
    .Include(t => t.ItemsOfTable2.Select(t2 => t2.ItemsOfTable3.OfType<Table3Blue>().Select(t3 => t3.ItemsOfTable4))) 
    .ToList(); 

:)、私たちは次のように含ま経て表1から表4に、この構造を読みたいですナビゲーションプロタイプに定義されているperty。参照ナビゲーションプロパティには点線のパスを使用し、コレクションナビゲーションプロパティにはSelect演算子を使用します。 のParameterName:。??。パス」私が間違っているのは何

どのように私は、データベースへの私の方法で表4-オブジェクトを含むん

敬具、これが私たちの回避策です

+0

メイトが見える... https://connect.microsoft .com/VisualStudio/feedback/details/594289/in-entity-framework-a-way-to-eager-load-include-navigation-of-a-derivedクラス – grek40

答えて

0

メイトを私はこれを疑います最善の解決策なので、より良い方法が高く評価されている...

Table3Baseは、仮想プロパティとして表4にコレクションナビゲーションプロパティを取得します。

Table3Red(表4-オブジェクトのないオブジェクト)がオーバーライドこのプロパティは、getterがTable4オブジェクトの空のリストを返し、セッターは返しません。

したがって、タイプチェックを行わずにIncludeをTable4までカスケードすることができます。私たちのPTHデータベーステーブル "Table3Base"には不要なレコードはありません。したがって、未使用のナビゲーションプロパティを持つTable3Redの不定期の定義を除いて、すべてが問題ありません。 :-(

BTW:このパスに沿ったすべてのオブジェクトが含まれているので、明示的な "Include(A).Include(AB).Include(ABC)"は不要です; "インクルードあなたは、サポートされていないために求めているように)」同じことをするでしょう。コードサンプルで繰り返し処理.INCLUDEを明確にするためである。

HTHは、

関連する問題