循序渐进开发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 = 0; //年龄          
    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 = 0; //年龄          
private string m_Creator; //创建人          
private DateTime m_CreateTime; //创建时间          

#endregion

我们看到,对于字符型的ID主键字段,代码生成的时候,已经自动添加默认属性值(GUID:System.Guid.NewGuid().ToString() )的了,这样我们创建实体类的时候,这个ID的值就已经生成了。

好了,基于篇幅的原因,下次继续介绍项目框架代码的各部分组成,以及他们之间的关系,注意的实现和内在约定等内容。
循序渐进开发WInform项目--系列文章导引:
循序渐进开发WinForm项目(6)--开发使用混合式Winform模块
循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
循序渐进开发WinForm项目(4)--Winform界面模块的集成使用
循序渐进开发WinForm项目(3)--Winform界面层的项目设计
循序渐进开发WinForm项目(2)--项目代码的分析
循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容