EF代码首先将多个类映射到一个表

时间:2011-07-26 15:36:56

标签: .net entity-framework ef-code-first code-first

我有一个非常复杂的数据库,我想首先映射到代码,但我遇到的问题是需要将表拆分为两个单独的类。

表结构的基本示例如下:

Site
----
Id
Name

Person
------
Id
Name
Dob
Address
Rank
Age
SiteId

PersonRoleLink
--------------
PersonId
RoleId

Role
----
Id
Name

基本上,网站有很多人,每个人都可以扮演很多角色。

取决于人员的角色取决于填充的属性。

理想情况下,我想要一个类结构如下:

public class Site {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Customer> Customers { get; set; }
  public virtual ICollection<Employee> Employees { get; set; }
  public virtual ICollection<Manager> Managers { get; set; }
}

public class PersonBase {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual Site Site { get; set; }
}

public class Customer : PersonBase {
  public string Name { get; set; }
  public DateTime Dob { get; set; }
}

public class Employee: PersonBase {
  public int Age { get; set; }
}

public class Manager: PersonBase {
  public int Rank { get; set; }
}

CustomerEmployeeManager都来自Person表,并且依赖于PersonRoleLink表中的相关链接。

因此,当我调用Site.Managers之类的内容时,返回的Person表中的行是具有正确SiteId且带有Role的链接,称为“经理”

这个结构首先在代码中可行吗?如果是这样,如何实现这一目标的映射,如果没有,那么这个结构是否有任何可行的替代方案?

谢谢

1 个答案:

答案 0 :(得分:1)

EF是不可能的,因为它是数据驱动的映射,EF代码首先不支持它,除了单个异常:每个层次表继承映射表,其中映射表中单列的值可以不同映射子实体。在您的情况下,不同实体类型的值是两个关系。此外,来自人员表的一条记录可以表示多个实体实例。这是另一个问题,因为这些实例不具有唯一键,EF将无法执行此操作。

一般来说,您所谓的对象模型是错误的,因为您可以拥有一名员工和经理。它不应该导致两个不同的“Person”对象。用户Person直接将导航属性添加到角色并创建帮助方法以获取经理,员工和客户。