在《实现存储过程的自动映射》中,我通过基于T4的代码生成实现了CUD存储过程的自动映射。由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景。如果两种模型存在差异,在进行数据更新操作的时候就会出错。本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程。
目录
一、创建具有继承关系的实体
二、基于继承关系实体的查询与更新
三、映射标准的CUD存储过程
四、修正存储过程
假设数据库中有如下两个关联的表:T_EMP和T_SALES。T_EMP用于存储员工信息,主键为代表员工ID号的EMP_ID。为了简单起见,我仅仅定义两个额外的字段:FIRST_NAME和LAST_NAME。另一个表T_EMP用于存储销售人员的信息,它具有一样的主键EMP_ID,额外的两个字段代表负责的区域(Territory)和提成的比率(Commission Rate)。两者通过EMP_ID进行关联。
然后我们通过选择这两个表创建.edmx模型。由于这两个表之间具有关联,.edmx模型得两个实体之间会默认创建联系,你首先需要删除此联系。由于销售人员也是公司的员工,它属于是员工类型的子类。所以你需要建立它们之间的继承关系。由于具有继承关系的两个实体不能有重复的属性,属于你需要删除掉T_SALES的EMP_ID属性。最后你需要修正实体和属性的名称使之更具可读性。最后的.edmx模型如下图所示。
二、基于继承关系实体的查询与更新
在引入存储过程之前,我们先来谈谈针对于如上一个具有继承关系实体的.edmx模型,如果进行查询和更新。使用过EF的读者应该很清楚,客户端代码进行数据的查询和更新都是通过自动生成的一个继承自ObjectContext的类来完成的。我们不妨来看看针对上面创建的.edmx模型,这个类具有怎样的定义。由于我为该模型的Entity Container起名为HrEntities,随后最终生成的是如下一个同名的类。
2: {
get}
public void AddToEmployees(Employee employee)
5: {
//...
7: }
8: }
9:
class Employee : EntityObject
11: {
//...
13: }
class Sales : Employee
15: {
//...
17: }