EntityFramework模型构建

时间:2015-02-14 16:09:08

标签: asp.net entity-framework asp.net-web-api

我有一个类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

数据库表是以这种方式构建的,我需要能够做这样的事情,因为我有另一个类,它有一个雇员的外键和一个经理。

我如何实现这一目标,还是有另一种方法可以解决我的问题?

1 个答案:

答案 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指定值。如果跳过继承的类,则在访问层次结构中的任何类时将收到运行时错误。