数据库表关系模型解析3——自连接

此处详细记录了现实项目中自连接的列表页面和增删改查页面。
狼奔代码生成器可以自动生成ASP.NET页面及后台代码。
生成的项目用到的技术有:Jquery+MVC+Entity Framework。

实践开发过程中,我们使用PowerDesigner设计数据库模型。狼奔代码生成器就是读取PowerDesigner设计的数据库模型,分析其中的表与表之间的关系模型,分析其中的表和字段的说明信息中的关键字,自动生成不同的页面。

表与表之间的关系模型包括

  1. 单表数据模型
  2. 自连接数据模型
  3. 一对一数据模型
  4. 一对多数据模型
  5. 一对多数据模型中的一张表是自连接
  6. 多对多数据模型
  7. 多对多数据模型中的一张表是自连接

关键字包括

  1. 查询
  2. 状态
  3. 上传
  4. 工作流

 

架构图

组件说明

图表 1项目组件说明图

  1. App——页面展示层

    采用MVC框架,使用Jquery脚本库,控件选用Easyui。

  2. WcfHost——服务宿主(后期扩展)

    为对外的服务提供宿主,使用WCF技术,HTTPS通讯协议。

  3. IBLL——业务接口层

    业务逻辑层的方法对外暴露的接口和服务契约。

  4. BLL——业务逻辑层

    业务逻辑的操作,包括业务处理,事务,日志。

  5. DAL——数据访问层

    数据库访问的操作,数据实体,业务实体,数据校验,使用Entity Framework。

  6. Common——公共组件层

    整个应用程序使用的公共辅助方法。

  7. WFActivitys——工作流活动层(后期扩展)

    定义了工作流需要的活动,使用微软WF技术。

  8. 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;命名空间。

服务层

(后期扩展)

删除

先选中一条,然后点击删除,请先删除子部门,再删除父部门

创建

修改

查看详细信息

 

posted @ 2011-09-13 09:50  腾飞刘  阅读(3865)  评论(2编辑  收藏  举报