实体框架代码第一个TPH判别器列

时间:2015-04-06 17:23:14

标签: c# entity-framework ef-code-first table-per-hierarchy

我正在使用Entity Framework 6.0,其中包含Code First和Table per Hierarchy(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。条目1的条目不同于Type的所有条目都应映射到类Other

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

1 个答案:

答案 0 :(得分:2)

我不相信可能不使用逻辑进行映射,我很确定不可能将鉴别器列作为您班级中的属性来访问

另外,我认为从概念上讲存在一个问题,即OOP继承真的适用于这种情况吗?在OOP中,兄弟类不能在继承层次结构中侧向投射,只能向上和向下投射,例如苹果可以投射到水果上,但苹果不能投入橙色。在您的示例中,类型为&#34;其他&#34;的员工可能有一天(运气好的话)成为首席执行官。这是一个小问题,不太可能出现,可以直接修改SQL(丑陋),但它表明继承不是解决问题的正确方法。