我有一个非常复杂的数据库,我想首先映射到代码,但我遇到的问题是需要将表拆分为两个单独的类。
表结构的基本示例如下:
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; }
}
Customer
,Employee
和Manager
都来自Person
表,并且依赖于PersonRoleLink
表中的相关链接。
因此,当我调用Site.Managers
之类的内容时,返回的Person
表中的行是具有正确SiteId且带有Role
的链接,称为“经理”
这个结构首先在代码中可行吗?如果是这样,如何实现这一目标的映射,如果没有,那么这个结构是否有任何可行的替代方案?
谢谢
答案 0 :(得分:1)
EF是不可能的,因为它是数据驱动的映射,EF代码首先不支持它,除了单个异常:每个层次表继承映射表,其中映射表中单列的值可以不同映射子实体。在您的情况下,不同实体类型的值是两个关系。此外,来自人员表的一条记录可以表示多个实体实例。这是另一个问题,因为这些实例不具有唯一键,EF将无法执行此操作。
一般来说,您所谓的对象模型是错误的,因为您可以拥有一名员工和经理。它不应该导致两个不同的“Person”对象。用户Person
直接将导航属性添加到角色并创建帮助方法以获取经理,员工和客户。