簡體   English   中英

實體框架代碼第一個TPH標識符列

[英]Entity Framework Code First TPH Discriminator Column

我使用的是帶有代碼優先級和按層次結構表(TPH)繼承的Entity Framework 6.0。

請參閱以下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**));
    }
}

我想將Type列(應該是discriminator列)的所有1條目映射到CEO類。 對於列Type所有條目的條目均不同於1的條目都應映射到類Other

這里出現兩個問題。 第一個是如何編寫.HasValue(**<>1**)); 作為正確的代碼。 第二件事是我想在代碼中使用Type列,但是由於這是discriminator列,因此我無權對其進行訪問。

我不認為不可能在映射中使用非邏輯,並且我很確定不可能在您的類中將discriminator列作為屬性來訪問。

另外,我認為從概念上講是有問題的,也就是說,OOP繼承真的適用於這種情況嗎? 在OOP中,兄弟類不能在繼承層次結構中橫向轉換,只能上下轉換,例如,可以將蘋果轉換為水果,但不能將蘋果轉換為橙色。 在您的示例中,“其他”類型的員工可能有一天(有些運氣)成為CEO。 這是一個小問題,不太可能出現,可以通過直接(丑陋)修改SQL來解決,但這表明繼承不是解決問題的正確方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM