2016-02-21 42 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