C# 实体框架:如何将具有不同键的多个表映射到一个实体?
我有这样一个DB结构: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
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映射为继承,则您的模型将具有此属性
- 一个
将是人
、学生
或教师
系统用户
- 如果您确实有一个扮演多个角色的真人,那么数据库中每个角色都需要多个个人记录,每个人都有其唯一的主键
- 现有
记录的角色无法更改-这意味着人员
将始终是学生
,如果不先删除学生
并创建新的人员/学生
,则无法将其更改为人员/教师
教师
Person
本身应该是唯一的,而Teacher
/Student
只是提供了额外的细节。@bradcristie-“这两行通过它们共享的主键值链接在一起”。我发现了很多这样的例子。我需要的是一个示例,其中它们不是通过主键链接的,而是通过唯一键上的FK链接的。我可以更改模式,使派生表使用PersonID作为其主键,但我想知道是否有可能不这样做。这种连接通常涉及第三个链接表。i、 e.PersonTeacher(PersonID、TeacherID)
(或类似)。因此,您拥有的结构是其他结构类型的混合形式(基本上不是“典型”)@BradChristie-该交集表适用于多对多关系。我有一对零或一的关系…?@BradChristie-fair point。我只是有点喜欢给每个表都赋予自己的自动编号标识列。但是我想没有真正的理由这么做。+1注意到Person的不同子类之间不能有重叠-谢谢!