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

C# 实体框架:如何将具有不同键的多个表映射到一个实体?,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我有这样一个DB结构: 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 nul

我有这样一个DB结构:

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
上都有一个唯一的键。
系统用户
可能与
教师
学生
是同一个人;事实上,你可以想象有一个人是三个都是

现在,我想让EF实体表示
Teacher
Student
SystemUser
,每个实体实际上都继承自
Person
(一等奖),或者至少合并类中的
Person
字段,隐式映射到两个基础表

我在网上找到了很多示例,它们共享相同的主键,但没有一个示例不共享相同的主键,即派生表上的
PersonID
映射到
Person
表上的
ID

你是怎么做到的

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

如果这是您的要求,您不能将person与其他类映射在一起。您必须仍然拥有单独的
Person
类和单独的
PersonDetail
类,其中
PersonDetail
可以派生出
Student
Teacher
SystemUser
类,这些类映射了TPT继承。您必须将
Person
PersonDetail
之间的关系映射为一对多,以支持该需求

如果您将person映射为继承,则您的模型将具有此属性

  • 一个
    将是
    学生
    教师
    系统用户
  • 如果您确实有一个扮演多个角色的真人,那么数据库中每个角色都需要多个个人记录,每个人都有其唯一的主键
  • 现有
    人员
    记录的角色无法更改-这意味着
    学生
    将始终是
    学生
    ,如果不先删除
    人员/学生
    并创建新的
    人员/教师
    ,则无法将其更改为
    教师

我相信你在寻找遗产?然而,奇怪的是,你“复制”了PK,因为
Person
本身应该是唯一的,而
Teacher
/
Student
只是提供了额外的细节。@bradcristie-“这两行通过它们共享的主键值链接在一起”。我发现了很多这样的例子。我需要的是一个示例,其中它们不是通过主键链接的,而是通过唯一键上的FK链接的。我可以更改模式,使派生表使用PersonID作为其主键,但我想知道是否有可能不这样做。这种连接通常涉及第三个链接表。i、 e.
PersonTeacher(PersonID、TeacherID)
(或类似)。因此,您拥有的结构是其他结构类型的混合形式(基本上不是“典型”)@BradChristie-该交集表适用于多对多关系。我有一对零或一的关系…?@BradChristie-fair point。我只是有点喜欢给每个表都赋予自己的自动编号标识列。但是我想没有真正的理由这么做。+1注意到Person的不同子类之间不能有重叠-谢谢!