实体框架:如何将具有不同键的多个表映射到一个实体?

时间:2012-10-21 13:27:02

标签: c# entity-framework entity-framework-5

我有这样的数据库结构:

create table Person (
  ID bigint identity not null,
  FirstName varchar(100),
  LastName varchar(100),
  -- etc... lot's of generic fields that apply to a person, e.g. phone, address
)

create table Teacher (
  ID bigint identity not null,
  PersonID bigint not null,
  EmploymentDate date,
  -- plus a bunch of other teacher-specific fields
)

create table Student (
  ID bigint identity not null,
  PersonID bigint not null,
  EnrollmentDate date,
  -- plus a bunch of student-specific fields
)

create table SystemUser (
  ID bigint identity not null,
  PersonID bigint not null,
  UserName varchar(50) not null,
  -- plus any user specific fields
)

Person与所有其他字段之间的关系为1 - > 0:1,Person的每个“子类”在PersonID上都有唯一键。 SystemUser可以与TeacherStudent相同;事实上,你可以想象一个人都是三个人。

现在,我想让EF实体代表TeacherStudentSystemUser,每个实体都要实际继承自Person(一等奖),或者至少包含类中的Person字段,隐式映射到两个基础表。

我在网上找到了很多他们共享相同主键的示例,但没有他们共享相同主键的情况,即派生表上的PersonID映射到IDPerson表。

你是怎么做到的?

1 个答案:

答案 0 :(得分:1)

  事实上,你可以想象一个人都是三个人。

如果这是您的要求,则不得将人员与其他课程一起映射。您还必须拥有单独的Person类和单独的PersonDetail类,其中PersonDetail可以派生StudentTeacherSystemUser类与TPT继承映射。您必须将PersonPersonDetail之间的关系映射为一对多才能支持该要求。

您使用继承映射人员的模型将具有此属性

  • 一个Person将为StudentTeacherSystemUser
  • 如果你确实有一个真正的人扮演多个角色,你需要在数据库中为每个角色创建多个人员记录 - 每个角色都有其唯一的主键
  • 现有Person记录的作用无法更改 - 这意味着Student始终为Student,如果没有先删除,则无法将其更改为Teacher Person/Student并创建新的Person/Teacher