我有一个类Employee
,如下所示:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Manager { get; set; }
}
我有另一个类Manager
,它扩展了这个类并且不添加任何其他功能:
public class Manager : Employee
{
}
在我的DbContext
派生类中,我有:
public DbSet<Employee> Employees { get; set; }
public DbSet<Manager> Managers { get; set; }
我希望将Employee.Manager == 1
的员工添加到Managers
DbSet
,并将Employee.Manager == 0
的员工添加到Employees
{1}} DbSet
。
数据库表是以这种方式构建的,我需要能够做这样的事情,因为我有另一个类,它有一个雇员的外键和一个经理。
我如何实现这一目标,还是有另一种方法可以解决我的问题?
答案 0 :(得分:1)
为了让Code First使用您的自定义鉴别器列,您必须使用Fluent API修改默认行为。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.Map(e => e.Requires("Manager").HasValue(0))
.Map<Manager>(m => m.Requires("Manager").HasValue(1));
base.OnModelCreating(modelBuilder);
}
有几点需要注意:
此方案中只有一个DbSet<Employee>
。 DbSet<Manager>
无法使用。通过检查Employee
值,可以将从数据库中检索到的Manager
标识为管理员,并自动为var manager = new Manager()
分配正确的鉴别器。
从Employee
继承的所有类型必须为此modelBuilder
中的Discriminator指定值。如果跳过继承的类,则在访问层次结构中的任何类时将收到运行时错误。