0

我正在使用具有 Code First 和 Table per Hierarchy (TPH) 继承的 Entity Framework 6.0。

请参阅以下 MWE(我省略了其他 fluent 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**));
    }
}

我想将所有具有1for 列Type(应该是鉴别器列)的条目映射到 class CEO1与列的条目不同的所有条目Type都应映射到类Other

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

4

1 回答 1

2

我不相信可以使用 not 逻辑进行映射,而且我很确定不可能将鉴别器列作为类中的属性来访问。

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

于 2015-04-06T19:09:20.773 回答