2015-04-06 114 views
0

我使用實體框架6.0與代碼優先和表每層次(TPH)繼承。實體框架代碼第一個TPH鑑別器列

請參閱以下MWE(我省略了其他流暢API聲明,以澄清問題的所在):

public abstract class Employee 
{ 
    public int EmployeeId { get; set; } 
    public string Type { get; set; }   
} 

public class CEO : Employee 
{ 
    public CEO() {Type = 1} 
} 

public class Other : Employee 
{ 

} 

public class InheritanceMappingContext : DbContext 
{ 
    public DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Employee>() 
       .Map<CEO>(m => m.Requires("Type").HasValue(1)) 
       .Map<Other>(m => m.Requires("Type").HasValue(**<>1**)); 
    } 
} 

我要地圖其中有一個1爲列Type(這應該是所有條目鑑別器列)到類CEO。對於Type列,條目不同於1的所有條目都應映射到類Other

這裏出現兩個問題。第一個是如何編寫.HasValue(**<>1**));作爲正確的代碼。第二件事是我想在我的代碼中使用Type列,但由於這是鑑別器列,我無法訪問它。

回答

2

我不相信有可能不使用邏輯來進行映射,而且我非常肯定,不能將鑑別器列作爲類中的屬性進行訪問。

另外,我認爲在概念上存在一個問題,即OOP繼承是否真的適用於這種情況?在OOP中,兄弟類不能在繼承層次結構中橫向轉換,只能向上和向下轉換,例如,蘋果可以轉換爲水果,但蘋果不能轉換爲桔子。在你的例子中,一個「其他」類型的員工有一天可能會成爲首席執行官。這是一個小問題,不太可能出現,可以通過直接修改SQL(醜陋)來解決,但這表明繼承不是解決問題的正確方法。

+0

謝謝,關於繼承的好處。我將該概念更改爲一個具有'Type'屬性的類Employee,作爲代碼中的鑑別器,但只有一個表和沒有鑑別器列。 – user2653422

相關問題