みなさんこんにちは、幸せな新しい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-オブジェクトを含むん
敬具、これが私たちの回避策です
メイトが見える... https://connect.microsoft .com/VisualStudio/feedback/details/594289/in-entity-framework-a-way-to-eager-load-include-navigation-of-a-derivedクラス – grek40