循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了。
其实也许我们每天面对的太多东西了,觉得很多都稀松平常了,即使很细微的地方,可能我们都已经形成习惯了。反过来,如果我们切换到其他领域,如IOS、android,那么开始我们可能对里面很多设计的规则不甚了解,开始可能也是一头雾水。
本篇想作为我的《循序渐进开发WinForm项目》系列的开篇,主要介绍数据库设计方面注意的一些事项,从而方便项目框架的搭建和开发过程。
1、数据库表设计
俗话说万层高楼从底起,开发应用项目,数据库的设计很重要,它可能是业务对象,业务流程的综合设计,好的数据库设计可以减少后期的重复返工,提高开发效率。
我们以一个简单的数据库表进行设计讨论,一步步分析其中的关系。

1)表和字段名称
一般表名称,根据不同的业务关系,我们可以使用不同的前缀进行区分,使用前缀,可以非常方便区分不同的业务表,如我自己一般基础表使用 “TB_” 定义前缀,权限系统表使用"T_ACL_"定义前缀,工作流表使用“TBAPP_”,业务表使用"T_"等,这样对于区分不同的业务,方便管理很有好处。
字段名称方面,我们可以约定一些规则,如约定主键使用ID;一般来说,ID作为主键,可以使用自增长的整形字段,也可以使用GUID的字符型字段,如果为了方便兼容不同的数据库且方便迁移或者开发基于网络方面的应用,我建议还是使用GUID的字符型字段,使用这种类型的字段,我们从创建数据的时候,就可以知道这个记录的主键,对于我们维护父子表等关系非常有利。
字段的命名,建议一简单为主,如客户名称,直接使用Name来命名即可,不需要使用CustomerName这样啰嗦的名称。
由于如果采用字符型的ID主键,那么我们如果需要正确排序的时候,可能需要增加一个CreateTime的日期类型,方便我们根据日期进行排序。
如果这个表还有一个外键的引用,建议统一命名标准,我一般使用“表名称_ID这样的名称,如User_ID、Contact_ID等相似的名称作为外键,不需要表的前缀。
2)数据库的模型设计
数据库的模型设计,我们建议在第三方的数据库设计工具上进行设计,如PowerDesigner这样的设计工具,使用工具设计数据库有很多好处,一个是可以高效率进行调整,二是根据需要生成不同的数据库类型Sql语句,三是可以全局了解各个表之间的关系等等。
使用PowerDesigner这样的数据库设计工具,能够在很大程度上提高我们数据库的设计效率。
2、项目框架的生成
设计好数据库后,我们通过代码生成工具进行整个项目框架的生成,这样对于我们在开发新项目上有很好的好处,里面的项目层级、DLL的 引用关系,已经处理好了,这样对我们非常方便。不过大多数情况下,我们都是增量开发较多,也就是我们可能前面已经完成了一些其他业务的开发,可能新增一个两个表,或者一批业务表的处理,这样也没关系,我们把新生成的代码复制到项目即可,由于项目生成的时候,指定了主命名空间和相关的表前缀,这样我们生成后的代码就方便阅读很多,减少累赘和出错的机会。

WInform开发框架,常见的分层模式,可以分为UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等

这个分层,在Web项目或者WInform项目(包括WPF项目)这些分层都是可以重用的,这样我们就不用重复处理界面一下的逻辑,针对性的开发我们需要的界面层即可。
DAL层根据不同的需要,扩展支持不同的数据库类型,每个数据库类型,对应一个数据库访问实现层即可,它们实现IDAL层的接口,称之为数据库访问接口实现层。

如果我们选择开发混合型开发应用,我们可能还会有一些WCF的服务逻辑层、WCF服务层、客户端调用层、界面层(后面再介绍)等方面,如下的项目结构所示。

3、项目代码分析
通过代码工具,我们已经可以完整生成基础的项目框架了,下面我们来分析下项目的源码,从而知道整个框架的架构和代码的层次是如何的。
刚才我们看到,生成的项目里面,已经包含了实体类,我们以开篇介绍的一个表生成的代码来进行研究分析。

生成的实体类代码如下所示
/// <summary>
/// 客户信息
/// </summary>
[DataContract]
public class CustomerInfo : BaseEntity
{
#region Field Members private string m_ID = System.Guid.NewGuid().ToString(); //编号
private string m_Name; //姓名
private int m_Age = ; //年龄
private string m_Creator; //创建人
private DateTime m_CreateTime; //创建时间 #endregion #region Property Members /// <summary>
/// 编号
/// </summary>
[DataMember]
public virtual string ID
{
get
{
return this.m_ID;
}
set
{
this.m_ID = value;
}
} /// <summary>
/// 姓名
/// </summary>
[DataMember]
public virtual string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
} /// <summary>
/// 年龄
/// </summary>
[DataMember]
public virtual int Age
{
get
{
return this.m_Age;
}
set
{
this.m_Age = value;
}
} /// <summary>
/// 创建人
/// </summary>
[DataMember]
public virtual string Creator
{
get
{
return this.m_Creator;
}
set
{
this.m_Creator = value;
}
} /// <summary>
/// 创建时间
/// </summary>
[DataMember]
public virtual DateTime CreateTime
{
get
{
return this.m_CreateTime;
}
set
{
this.m_CreateTime = value;
}
} #endregion }
其中我们看到下面的代码,里面使用了基类 BaseEntity,这个是所有生成的实体类的基类,基类BaseEntity只是一个实体类的声明,没有什么属性,使用这个实体类基类,只是为了整个框架更好管理和控制。BaseEntity来源于公用类库,已经封装在里面了。
/// <summary>
/// 客户信息
/// </summary>
[DataContract]
public class CustomerInfo : BaseEntity
{
另外,我们看到,实体类有注释,这些注释来自数据库的备注信息,包括字段的注释也是来自数据库的备注说明信息。
还有类的定义里面,还看到了[DataContract] 的标签,以及类的属性[DataMember],这个是WCF技术里面传输数据的协议声明,我们目前开发的应用,一般都是基于.NET4.0的了,因此包含这个属性方便我们在开发网络版项目的时候用到,一般情况下忽略即可。
我们继续看看实体类的其他部分代码:
#region Field Members
private string m_ID = System.Guid.NewGuid().ToString(); //编号
private string m_Name; //姓名
private int m_Age = ; //年龄
private string m_Creator; //创建人
private DateTime m_CreateTime; //创建时间
#endregion
我们看到,对于字符型的ID主键字段,代码生成的时候,已经自动添加默认属性值(GUID:System.Guid.NewGuid().ToString() )的了,这样我们创建实体类的时候,这个ID的值就已经生成了。
好了,基于篇幅的原因,下次继续介绍项目框架代码的各部分组成,以及他们之间的关系,注意的实现和内在约定等内容。
循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成的更多相关文章
- 循序渐进开发WinForm项目(6)--开发使用混合式Winform模块
1.Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件. ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(4)--Winform界面模块的集成使用
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(3)--Winform界面层的项目设计
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 循序渐进开发WinForm项目(2)--项目代码的分析
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- 第二天ci项目规划 数据库设计
第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...
- Vue/Egg大型项目开发(二)数据库设计
项目Github地址:前端(https://github.com/14glwu/stuer)后端(https://github.com/14glwu/stuer-server) 项目线上预览:http ...
- HNU_团队项目_数据库设计感想_个人感想
数据库设计感想 个人的一点心得体会 最重要的放在最前面——讨论开会时的123经验 开会前对会议目的及方式要有所考虑: 不要随意无目的开会: 遵守时间,控制会议时间长度: 会议主持人要维持会议只需,有 ...
- Django 博客项目01 数据库设计与验证码校验+Ajax登录
数据库设计 from django.db import models from django.contrib.auth.models import AbstractUser class UserInf ...
随机推荐
- AWVS漏洞测试-03节-添加扫描项目
http://localhost:9660 我们要扫描这个页面 点击左上角的New Scan,在Scan Single哪里输入要扫描的网站地址,可以是本地地址 然后选择下一步 Next 这里我们可以配 ...
- Android开发(二十五)——Android上传文件至七牛
设置头像: Drawable drawable = new BitmapDrawable(dBitmap); //Drawable drawable = Drawable.createFromPath ...
- iOS杂谈-我为什么不用Interface builder
在互联网上关于Interface Builder的争吵每天都在发生,用和不用大家都有一大堆的理由.最近看了这篇文章,很多地方和作者有共鸣,结合自己的一些经历,就有了你现在所看到的东西,你可以把它当成前 ...
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- Gson整合Volley返回对象--GsonRequest
Gson是一个使用映射支持JSON与Java对象之间相互转换的库文件.你可以定义和JSON keys相对应名称的Java对象.把对象传递给传递Gson,然后Gson会帮你为对象填充字段值. 下面是一个 ...
- swift 方法
swift的类,结构体,枚举中都可以定义方法. 1:实例方法.类似于类成员方法 1.1实例方法是属于类,结构体,枚举的实例的方法.通过其实例访问. class CShow{ func testShow ...
- vs.php调试php使用外部的apache进行调试
vs.php中使用外部的apache进行调试 一般phper们都会有自己配置好的开发调试环境,那么如何在vs.php中使用自己已经配置好的apache+php环境调试 php程序呢?如下: (1)从官 ...
- Node.js 的module 系统
相较于原生的JavaScript,不同的JavaScript文件之间很难共享变量.有鉴于此,Node.js在JavaScript的基础上进行了扩充,引入了require,exports,module三 ...
- IOS8Preview-xCode_6
IOS8Preview-xCode_6 what's new What's new in xCode 6 Xcode 6 introduces a radically new way to desig ...
- 《Programming with Objective-C》
苹果官方文档:不稳定的传送门 读书笔记共有以下几篇,其他的知识点不重要或者已经熟悉不需记录 <Programming with Objective-C>第三章 Working with O ...