首页 > 其他分享 >十二、NHibernate之代码生成工具

十二、NHibernate之代码生成工具

时间:2022-12-08 11:07:44浏览次数:74  
标签:代码生成 映射 数据库 十二 NHibernate 化类 模板


说明

这篇文章是完全转载自李永京的博客我看了下,也跟着实际操作了下,生成代码确实很方便,但是生成的代码却很难令人满意,不论从代码量还是从结构抑或复杂度来说,对我都是很大的挑战,更遑论今后的维护之类。所以,以我的感觉来说,代码生成器是很好的东西,但是需要自己来根据自己的需求来写才行。这样,生成的代码才是自己能够方便理解的代码,当然模板是我们很好的参考资料。以下是转载。

前言

我们花了大量的篇幅介绍了相关NHibernate的知识,一直都是带着大家手动编写代码,首先创建数据库架构,然后编写持久化类和映射文件,最后编写数据操作方法,测试方法。这是典型的数据库驱动开发(DbDD,Database-Driven Developent)技术,但是自己不是这样做的,我先编写持久化类和映射文件,然后偷偷的使用SchemaExport工具把数据库生成了,按上面的步骤写文章的,关于SchemaExport工具就是下一篇的事情了,这篇说说利用数据库架构用代码生成工具生成持久化类和映射文件。

所谓数据库驱动模型是指对象模型随着数据库架构改变而改变,那么我们为什么还使用这个技术呢?有两种原因:你的数据库是遗留下来的系统使用的,数据库中已经存在大量有用数据,不可以更换数据库就将就着使用了;你的数据库架构按照需求分析基本上确定了,不要做任何改动,在系统设计初期已经把数据库建好了。

让我们用一张图片来大致展示典型的数据库驱动开发模型。以数据库架构为核心。


十二、NHibernate之代码生成工具_浏览器

使用数据库驱动模型流程就是当数据库架构修改时候,映射文件和持久化类通过代码生成工具重新生成一下。我们只要修改应用程序即可。

这里延伸一个问题:数据库是否需要在项目开始前设计?

如果我们进行数据库设计,那么就产生一系列问题:我们在面向对象领域设计持久化对象必须考虑事先设计好的数据库表结构以及表关系,在编写映射文件时候也要考虑,在面向对象中的继承、多态等特性根本没法使用。所以我不推荐在项目开始设计数据库,大家认为如何?所以使用代码生成工具是下下策。

代码生成工具

顾名思义,代码生成工具大家都使用过,有商业的​​CodeSmith​​​开源的​​MyGeneration​​​等,这篇我们介绍如何使用开源MyGeneration代码生成工具根据数据库架构生成映射文件和持久化类。如果你机器上还没有安装MyGeneration,请到​​这里​​下载,然后安装MyGeneration,安装之后,打开MyGeneration,配置“默认设置”、打开“模板浏览器”窗口,这些步骤如果不清楚的话请转向​​NHibernate之旅(15):探索NHibernate中使用存储过程(上)​​文章中吧,具体介绍了上面的步骤和方法。

再提示一下:如果你的操作系统是Windows Vista,请右击“以管理员身份运行”MyGeneration。

这篇我们接着做:

Step1:点击“模板浏览器”窗口的第三个“在线更新”按钮:来在线下载模板。


十二、NHibernate之代码生成工具_数据库_02

Step2:出现“在线模板库”窗口,在“在线模板库”中提供了各种各样的模板,找到NHibernate节点:


十二、NHibernate之代码生成工具_工具_03

Step3:展开NHibernate节点,找到“NHibernate Sharp 1.4 [sharpm64]”模板,右键点击“保存”。这个模板就自动保存到本地模板文件夹中。


十二、NHibernate之代码生成工具_工具_04

Step4:点击“模板浏览器”窗口的第一个“刷新”按钮,这个模板就在“模板浏览器”可以看见了,展开NHibernate节点,右击“执行”NHibernate Sharp1.4模板。


十二、NHibernate之代码生成工具_数据库_05

Step5:这就是NHibernate OHM界面窗口,右面显示表、视图、操作标签,在表标签界面上,右边有不映射、映射等按钮,在表中不同的颜色代表字段不同的属性。


十二、NHibernate之代码生成工具_windows_06

Step6:点击“CustomerId”列,右边显示了这个表,并在状态栏显示了“CustomerId”列的属性:int类型、主键。另外可以自己摸索一下:


十二、NHibernate之代码生成工具_工具_07

Step7:点击“视图”标签,设置CustomerId为主键。


十二、NHibernate之代码生成工具_浏览器_08

Step8:点击“操作”标签,我们具体设置程序集名称和命名空间名称,这里我设置GenDomainModel,设置生成工程,由于这个模板不支持VS2008,所以选择生成IDE版本为VS2005。设置输出路径。点击OK按钮。


十二、NHibernate之代码生成工具_windows_09

Step9:这时打开文件夹,代码生成工具根据数据库架构生成了相应的持久化类和映射文件。


Step10:用VS2008打开,VS2008自动升级GenDomainModel.csproj解决方案文件,解决方案项目文件如下:


十二、NHibernate之代码生成工具_数据库_10

Step11:这时就可以使用了,可以把这个类库利用添加现有项目功能添加到我们的项目中作为实体持久层,我们利用这个实体持久层编写数据访问层方法实现对数据库的CRUD操作,当然在使用前要搞清楚这个项目的类库架构,另外由于模板本身还不是很完善(例如这个模板不支持版本控制映射、不支持多对多直接映射),所以我们还需要按照实际情况去修改持久化类和映射,显然无形中增加了一些负担。

注意不要忘记在hibernate.cfg.xml中修改<mapping assembly="DomainModel"/>为<mapping assembly="GenDomainModel"/>。

结语

本身对于代码生成工具的使用很简单的,就是下一步下一步的按,这节就是多图展示一下怎么快速使用代码生成工具,在MyGeneration中还有很多模板用于生成NHibernate的持久化类和映射文件,每个模板都有自己的缺点和优点,生成不同的结构,这在于大家去发现了~~但是我发现还是自己手写代码才是霸道!思路清晰,代码简单!

至今不明白这个问题:代码生成工具到底给谁用的?新手?老鸟?唯一的好处就是快?不用写代码。但是你知道它生成的架构吗?它的思路吗?

 

 

标签:代码生成,映射,数据库,十二,NHibernate,化类,模板
From: https://blog.51cto.com/u_15906220/5920726

相关文章

  • 七、NHibernate关系之——一对多
    一对多关系​在数据库中,表与表之间的关系有一对一、一对多和多对多三种,他们是关系数据库最重要的表现之所在,如果丢失了表间的关系,那么一个数据库中的数据就只是一堆没有意义......
  • 三、NHibernate查询之HQL&Criteria
    一、什么是HQL(NHibernateQueryLanguage)查询语言Ø    定义:NHibernate查询语言(HQL,NHibernateQueryLanguage)是NHibernate特有的基于面向对象的SQL查询语言,它具有......
  • 二、第一个NHibernate程序
    一、准备要运行第一个NHibernate程序需要两个额外的DLL和两个xsd文件,他们可以在从官网上下载的文件里找到,DLL分别是NHibernate.dll和NHibernate.ByteCode.Castle.dll,xsd文件......
  • 八、NHibernate关系之——多对多
    多对多关系​废话不多说,看图:这里我们主要是要解决Order表和Product表之间的多对多的关系,相信有过数据库设计经验的人是很容易理解的,OrderProduct是一个关系表,而Order和Produ......
  • NHibernate学习笔记
    NHibernate学习笔记 一、         什么是NHibernate、为什么要用它及相关资源 二、         第一个NHibernate程序 三、         NHibern......
  • 十三、NHibernate之对象状态
     引入​在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象。这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分......
  • 十二、NHibernate之SchemaExport工具
    说明​使用领域驱动开发,我觉得还不太实际,或者说对于我来说条件还不成熟,因为我对NHibernate还不太熟悉,就现时来说,使用数据库驱动开发还是最好的选择,所以,我这里暂时先不管Sche......
  • 《DFZU2EG_4EV MPSoc之FPGA开发指南》第十二章 IP核之RAM实验
    IP核之RAM实验RAM的英文全称是RandomAccessMemory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频......
  • 初识Linux(十二)------ 计划任务(crontab)
      系统常常会主动的进行一些任务,这些任务到底是谁在设置工作的?如果你想要让自己设计的备份程序可以自动的在系统下面执行,而不需要手动来启动他,又该如何处置?这些例行的......
  • 十二、Docker入门系列--Docker-Compose常用命令
    十二、Docker入门系列--Docker-Compose常用命令一、Docker入门系列--Docker简介二、Docker入门系列--Docker安装三、Docker入门系列--Docker常用命令四、Docker入门系......