Entity Framework -- 使用类别字段的实体继承关系
我们经常使用数据表中的类别字段来分辨所存记录的类型,在对象场景下,我们一般会将其演化为有继承关系的一组对象,以符合面向对象的设计和使用,那么我们在Entity Framework环境中如何来实现这样的实体关系呢?这里将通过一些例子,来说明一般场景下的使用方式。
场景一:数据表Peoples记录了一些人,每个人都有唯一的工作类别,在该场景下,我们需要按照工作类别来构建一组对象,使得人根据工作类别进行了分类。
首先创建数据表如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-10-56-28.png)
填充数据如下:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-00-28.png)
[假设我们只对人进行四种分类(演员、商人、程序员、运动员)]
现在我们使用VS2008从数据库创建PeopleModel.edmx模型,如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-08-12.png)
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-09-17.png)
VS2008自动为我们创建了一个实体People,但是我们在这个场景下,需要有一个依据工作类别区分的对象层次,因此我们加入新的实体Actor(演员), Businessman(商人), Developer(程序员), Sporter(运动员) 他们都继承自People(创建实体时,指定其基类型为People), 如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-15-40.png)
创建后,我们得到了如下的模型:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-20-22.png)
现在,我们从People实体中删除JobCategory的映射,因为我们需要使用JobCategory来区别People的子类,而不是作为People的属性。设置People实体为抽象的(我们假设每一个人都有工作,呵呵)。
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-54-22.png)
然后,使用VS2008中的"映射详细信息"视图,为每个子类设置其映射的表和条件。
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-25-02.png)
每个子类都类似修改完毕后,我们的模型就大功告成了。
下面我们就可以通过代码来验证我们的模型了。
Code
场景一:数据表Peoples记录了一些人,每个人都有唯一的工作类别,在该场景下,我们需要按照工作类别来构建一组对象,使得人根据工作类别进行了分类。
首先创建数据表如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-10-56-28.png)
填充数据如下:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-00-28.png)
[假设我们只对人进行四种分类(演员、商人、程序员、运动员)]
现在我们使用VS2008从数据库创建PeopleModel.edmx模型,如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-08-12.png)
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-09-17.png)
VS2008自动为我们创建了一个实体People,但是我们在这个场景下,需要有一个依据工作类别区分的对象层次,因此我们加入新的实体Actor(演员), Businessman(商人), Developer(程序员), Sporter(运动员) 他们都继承自People(创建实体时,指定其基类型为People), 如图:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-15-40.png)
创建后,我们得到了如下的模型:
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-20-22.png)
现在,我们从People实体中删除JobCategory的映射,因为我们需要使用JobCategory来区别People的子类,而不是作为People的属性。设置People实体为抽象的(我们假设每一个人都有工作,呵呵)。
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-54-22.png)
然后,使用VS2008中的"映射详细信息"视图,为每个子类设置其映射的表和条件。
![](https://images.cnblogs.com/cnblogs_com/crossingdawn/2009-7-23-11-25-02.png)
每个子类都类似修改完毕后,我们的模型就大功告成了。
下面我们就可以通过代码来验证我们的模型了。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)