数据库表关系模型解析3——自连接
此处详细记录了现实项目中自连接的列表页面和增删改查页面。
狼奔代码生成器可以自动生成ASP.NET页面及后台代码。
生成的项目用到的技术有:Jquery+MVC+Entity Framework。
实践开发过程中,我们使用PowerDesigner设计数据库模型。狼奔代码生成器就是读取PowerDesigner设计的数据库模型,分析其中的表与表之间的关系模型,分析其中的表和字段的说明信息中的关键字,自动生成不同的页面。
表与表之间的关系模型包括
-
单表数据模型
-
自连接数据模型
-
一对一数据模型
-
一对多数据模型
-
一对多数据模型中的一张表是自连接
-
多对多数据模型
-
多对多数据模型中的一张表是自连接
关键字包括
-
查询
-
状态
-
上传
-
工作流
架构图
组件说明
图表 1项目组件说明图
-
App——页面展示层
采用MVC框架,使用Jquery脚本库,控件选用Easyui。
-
WcfHost——服务宿主(后期扩展)
为对外的服务提供宿主,使用WCF技术,HTTPS通讯协议。
-
IBLL——业务接口层
业务逻辑层的方法对外暴露的接口和服务契约。
-
BLL——业务逻辑层
业务逻辑的操作,包括业务处理,事务,日志。
-
DAL——数据访问层
数据库访问的操作,数据实体,业务实体,数据校验,使用Entity Framework。
-
Common——公共组件层
整个应用程序使用的公共辅助方法。
-
WFActivitys——工作流活动层(后期扩展)
定义了工作流需要的活动,使用微软WF技术。
-
WFDesigner——工作流设计器(后期扩展)
可以让实施人员自由配置工作流的设计器,使用微软WPF技术。
部门的作用
部门是一个典型的自连接表
下面我们以部门为例子分析自连接数据模型,代码已在生成的文件中,并且注释详备,此文不再赘述
自连接数据模型
就是自己连接自己,一个自己的主键连接了一个自己的外键
列表
页面展示层App
Mvc中的View的代码
此列表页面是参照\jquery-easyui-1.2.3\demo\treegrid3.html页面开发的,页面请求的数据格式如下:
{"total":117,"rows":[
{"id":1,"code":"code1","name":"name1","addr":"address1"},
{"id":11,"code":"code11","name":"name11","addr":"address11","_parentId":1},
{"id":12,"code":"code12","name":"name12","addr":"address12","_parentId":1},
{"id":2,"code":"code2","name":"name2","addr":"address2","state":"closed"}
]}
注意"_parentId"字段,当你按照这格式将全部数据都传到客户端,客户端脚本会根据"_parentId"字段自动的找出父子节点关系,所以我们按照这个格式定义了一个类SysDepartmentSef
备注:Entity Framework定义的实体字段不能以下划线开头,如果以下划线开头会添加一个前缀,所以需要我们自己设计一个SysDepartmentSef类,该类包含"_parentId"字段
Mvc中的Controller的代码
Mvc中的Model的代码
此文件中的类 SysDepartmentSef
业务接口层IBLL
此层作为业务逻辑层方法的接口,也是WCF对外暴露的契约
业务逻辑层BLL
数据字典类的业务逻辑写在BLL类库中,事务使用TransactionScope对象,SysDepartmentBLL.cs类文件里面封装了业务逻辑的操作方法,并且继承了BaseBLL基类
整个项目应该遵循的原则是:胖BLL,瘦mvc
这是获取自连接列表数据的方法很简单,就是将数据库中的部门实体(SysDepartment)集合转换成自定义的SysDepartmentSef实体集合
public List<SysDepartmentSef> GetAllMetadata()
{
SysEntities db = new SysEntities();
return repository.GetAll(db).Select(s =>
new SysDepartmentSef
{
Id = s.Id
,Name = s.Name
,_parentId = s.ParentId
,Sort = s.Sort
,PhoneNumber = s.PhoneNumber
,FaxPhoneNumber = s.FaxPhoneNumber
,Address = s.Address
}).OrderBy(o => o.Sort).ToList();
}
数据访问层DAL
其中SysDepartment.cs文件放置的是数据字典表的实体和实体元数据的验证,而SysDepartmentRepository.cs文件放置的是对数据字典访问数据库的方法
业务实体在SysDepartment.cs文件中的SysDepartment类,它是一个分部 partial 类,内部可以自定义属性,MetadataType属性中指定了该实体属性的校验类SysDepartmentMetadata,并且它继承了IBaseEntity接口(此接口暂时没有任何成员);
SysDepartment.cs文件中还有一个SysDepartmentMetadata类用于校验SysDepartment类中的成员。注意校验类需要引用using System.ComponentModel.DataAnnotations;命名空间。
服务层
(后期扩展)
删除
先选中一条,然后点击删除,请先删除子部门,再删除父部门
创建
修改
查看详细信息