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 来解决(丑陋),但这表明继承不是解决问题的正确方法。
我正在使用 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 来解决(丑陋),但这表明继承不是解决问题的正确方法。