使用ObjectType Discriminator列的实体框架TPT继承

时间:2014-12-17 12:04:08

标签: sql-server entity-framework inheritance database-design class-table-inheritance

我使用Entity Framework作为我的数据库的ORM。为了建模继承,我的数据库使用Table Per Type(aka Class Table Inheritance)模式。实体框架确实支持TPT继承。然而它非常慢。它为最简单的linq查询生成非常复杂的选择查询。 (请参阅此post)有关数据库中继承的背景知识,以下是关于不同类型的继承模式的nice post

作为替代方案,我的数据库使用TPT模式的变体,其中包括当前对象的子类型。这是关于post的建议。包含子类型应该可以进行更简单的查询,因为您知道要加入哪个子表。

问题:有没有办法告诉实体框架了解以下TPT模式并相应地做更简洁的选择查询?其次,我可以隐藏ORM中的类型列并让它只出现在数据库中吗?

采用以下示例:

父表:

create table People 
( 
    PersonID int primary key, 
    PersonTypeID int references PersonType(PersonTypeID),
    Name varchar(10) 
    constraint People_AltPK unique (PersonID,PersonTypeID)
)

儿童表:

create table Students 
(
    PersonID int primary key,
    PersonTypeID as 1 persisted, -- student 
    EnrollmentDate datetime,
    foreign key (PersonID, PersonTypeID) references People(PersonID, PersonTypeID) 
 ) 

 create table Teachers 
 (
    PersonID int primary key,
    PersonTypeID as 2 persisted, -- teacher
    HireDate datetime, 
    foreign key (PersonID, PersonTypeID) references People(PersonID, PersonTypeID) 
 )

create table Parents (
    PersonID int primary key,
    PersonTypeID as 3 persisted, -- parents 
    DifficultyScore int,
    foreign key (PersonID, PersonTypeID) references People(PersonID, PersonTypeID)
)

0 个答案:

没有答案