2011-07-26 82 views
1

我有一个相当复杂的数据库,我想先映射到代码,但我有一个表需要分成两个单独的类的问题。EF代码首先映射多个类到一个表

A中的表结构的基本示例如下:

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

这是不可能的EF,因为它是数据驱动的映射和EF代码第一不支持它除了一个例外:每个层次继承映射表,其中在映射表单个列的值可以有所不同映射子实体。在你的情况下,不同类型的实体的价值是两个关系。此外,人员表中的一条记录可以表示多个实体实例。这是另一个问题,因为这些实例不会有唯一的密钥,EF将无法做到这一点。

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

+0

很好的答案,谢谢。 – lancscoder