Entity Framework Code First TPH 鉴别器列

Entity Framework Code First TPH Discriminator Column

我正在使用 Entity Framework 6.0 代码优先和 Table 每个层次结构 (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**));
    }
}

我想将 Type 列(应该是鉴别器列)的 1 的所有条目映射到 class CEO。列 Type 的条目不同于 1 的所有条目都应映射到 class Other.

这里出现了两个问题。第一个是如何将 .HasValue(**<>1**)); 写成正确的代码。第二件事是我想在我的代码中使用 Type 列,但由于这是鉴别器列,我无法访问它。

我不认为可以使用 not 逻辑进行映射,而且我很确定无法在您的 class 中将鉴别器列作为 属性 访问.

另外,我认为在概念上有一个问题,即OOP继承真的适用于这种情况吗?在 OOP sibling classes 中,不能在继承层次结构中横向转换,只能向上和向下转换,例如,苹果可以转换为水果,但苹果不能转换为橙子。在您的示例中,"Other" 类型的员工可能有一天(运气好)成为首席执行官。这是一个小问题,不太可能出现,可以通过直接修改 SQL 来解决(丑陋),但这表明继承不是解决问题的正确方法。