2016-02-21 41 views
1

域模型如何使用在实体框架中使用TPH创建的表?

public abstract class BaseClass 
{ 
    public int Id { get; set; } 
    public int Something1 { get; set; } 
    public int Something2 { get; set; } 
    public string Something3 { get; set; } 
} 

public class PQR1 : BaseClass 
{ 
    public int value1 { get; set; } 
} 


public class PQR2 : BaseClass 
{ 
    public int value2 { get; set; } 
} 


public class PQR3 : BaseClass 
{ 
    public int value2 { get; set; } 
} 

上下文类

public class PQRContext : DbContext 
{ 
    public PQRContext() : base ("PQR") 
    { 

    } 

    public DbSet<BaseClass> Baseclass { get; set; } 




    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<BaseClass>(). 
      Map<PQR1>(m => m.Requires("Type").HasValue("Value1")) 
      .Map<PQR2>(m => m.Requires("Type").HasValue("Value2")) 
      .Map<PQR3>(m => m.Requires("Type").HasValue("Value3")); 
    } 
} 

它会创建表是这样的:

enter image description here

但我不知道如何编写代码时使用此表,我像这样卡住了 enter image description here

所以我不能访问像PQR1,PQR2,PQR3这样的其他类,因为我没有理由将数据插入到已经抽象的基类中。

回答

0

第一种选择:

你是不是restrcited上DbSet创作。您可以创建你需要多DbSet尽可能多的为您的派生类,如下面的代码和访问他们喜欢你将与其他DbSet做:

public DbSet<BaseClass> Baseclass { get; set; } 
public DbSet<PQR1> PQR1s { get; set; } 
public DbSet<PQR2> PQR2s { get; set; } 
public DbSet<PQR3> PQR3s { get; set; } 

您可以使用相关DbSet派生你想要插入或请求你的上下文。

第二个选项:

用于查询您的上下文并只获得所需的子类实体,你可以使用通用的方法OfType<T>充当这样的过滤器:

var myBaseClassList = myContext.BaseClass; // Retireve all PQR1, PQR2 and PQR3 entities 
var myPQR1List = myContext.BaseClass.OfType<PQR1>(); // Retireve all PQR1 
var myPQR2List = myContext.BaseClass.OfType<PQR2>(); // Retireve all PQR2 
var myPQR3List = myContext.BaseClass.OfType<PQR3>(); // Retireve all PQR3 

对于插入即可创建派生类的实例并将其直接添加到您的基类DbSet

var pqr1 = new PQR1() { /* set my properties */ }; 
myCOntext.BaseClass.Add(pqr1); // EF knows how to insert data for classes that use TPH. 
+0

谢谢!这真的很有帮助。 – Nil

+0

欢迎您:) – CodeNotFound

+0

嘿,如何将数据种入上表? @CodeNotFound – Nil