EntityFramework 模型构建
EntityFramework model building
我有一个 class Employee
,如下所示:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Manager { get; set; }
}
我有另一个 class Manager
扩展了这个 class 并且没有添加其他功能:
public class Manager : Employee
{
}
在我的 DbContext
派生 class 我有:
public DbSet<Employee> Employees { get; set; }
public DbSet<Manager> Managers { get; set; }
我希望将 Employee.Manager == 1
的员工添加到 Managers
DbSet
并将 Employee.Manager == 0
的员工添加到 Employees
DbSet
.
数据库 table 是以这种方式构建的,我需要能够做这样的事情,因为我有另一个 class,它有一个员工的外键和一个员工的外键经理。
我怎样才能做到这一点,或者有其他方法可以解决我的问题吗?
为了让 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
继承的 ALL 类型必须在此 modelBuilder
中为鉴别器赋予一个值。如果您跳过继承的 class,您将在访问层次结构中的任何 class 时收到运行时错误。
我有一个 class Employee
,如下所示:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Manager { get; set; }
}
我有另一个 class Manager
扩展了这个 class 并且没有添加其他功能:
public class Manager : Employee
{
}
在我的 DbContext
派生 class 我有:
public DbSet<Employee> Employees { get; set; }
public DbSet<Manager> Managers { get; set; }
我希望将 Employee.Manager == 1
的员工添加到 Managers
DbSet
并将 Employee.Manager == 0
的员工添加到 Employees
DbSet
.
数据库 table 是以这种方式构建的,我需要能够做这样的事情,因为我有另一个 class,它有一个员工的外键和一个员工的外键经理。
我怎样才能做到这一点,或者有其他方法可以解决我的问题吗?
为了让 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()
将自动分配正确的鉴别符。
从 ALL 类型必须在此
modelBuilder
中为鉴别器赋予一个值。如果您跳过继承的 class,您将在访问层次结构中的任何 class 时收到运行时错误。
Employee
继承的