天天看点

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t1" target="_blank">写在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t2" target="_blank">文档与系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t3" target="_blank">schemaexport工具</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t4" target="_blank">schemaupdate工具</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t5" target="_blank">一个例子</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t6" target="_blank">总结</a>

上篇文章介绍了使用代码生成器的nhibernate模版来生成持久化类,映射文件等内容。本篇文章将继续介绍工具schemaexport和schemaupdate。说实话,这东西我也是第一次使用,也只能边摸索,边学习了。

一般的开发模式是先将数据库架构设计好,然后再编写持久化类和映射文件,也就是数据库驱动的模式。然而也可以先编写持久化类和映射文件,然后通过schemaexport工具生成数据库架构。通过面向对象的思想,来生成对应的数据库架构,似乎是更合理的(个人观点)。

这种先编写持久化类和映射文件在生成数据库架构有什么好处呢?

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

如果在设计的时候,我们的领域模型需要改变,只需修改nhibernate结构和应用程序,不需要修改数据库架构,只要利用schemaexport工具重新生成数据库架构就可以了。

<a href="http://www.cnblogs.com/wolf-sun/p/3694592.html">[nhibernate]体系结构</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3694901.html">[nhibernate]isessionfactory配置</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3704012.html">[nhibernate]持久化类(persistent classes)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3705229.html">[nhibernate]o/r mapping基础</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3720259.html">[nhibernate]关联映射</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3721528.html">[nhibernate]parent/child</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3724052.html">[nhibernate]缓存(nhibernate.caches)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734249.html">[nhibernate]nhibernate.tool.hbm2net</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734313.html">[nhibernate]nullables</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3956802.html">[nhibernate]nhibernate如何映射sqlserver中image字段</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4046672.html">[nhibernate]条件查询criteria query</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4048048.html">[nhibernate]增删改操作</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4049716.html">[nhibernate]事务</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4050714.html">[nhibernate]并发控制</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4067026.html">[nhibernate]组件之依赖对象</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4068749.html">[nhibernate]一对多关系(级联删除,级联添加)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4070935.html">[nhibernate]一对多关系(关联查询)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4074654.html">[nhibernate]多对多关系(关联查询)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html">[nhibernate]延迟加载</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html">[nhibernate]立即加载</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082899.html">[nhibernate]视图处理</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4083402.html">[nhibernate]n+1 select查询问题分析</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4085314.html">[nhibernate]存储过程的使用(一)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4088288.html">[nhibernate]存储过程的使用(二)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4093539.html">[nhibernate]存储过程的使用(三)</a>

nhibernate的hbm2dll提供schemaexport工具:给定一个连接字符串和映射文件,不需输入其他东西就可以按照持久化类和映射文件自动生成数据库架构,现在schemaexport工具还不是很强大,但是一般应用足够了,它还是一个相当原始的api还在不断改进。 schemaexport工具就是把ddl脚本输出到标准输出,同时/或者执行ddl语句。schemaexport工具提供了三个方法,分别是drop()、create()、execute(),前两个方法实质是调用execute()方法。通常使用execute()方法来生成数据库架构的。
在nhibernate2.0中新添加schemaupdate工具,可以用来更新数据库架构。但是我觉得没有什么作用,因为它不能drop现有的表或列,也不能更新现有的列,只能添加新的表和列。如果我需要删除表或者列或者修改其中列,schemaupdate工具就显得无能为力了。

现在数据访问测试层新建一schemaexportfixture.cs文件用于测试。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

需要引入命名空间

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

测试drop方法

方法描述

drop(script, export)方法根据持久类和映射文件执行删除数据库架构。有两个参数,第一个为true就是把ddl语句输出到控制台,第二个为true就是根据持久类和映射文件执行删除数据库架构操作,经过调试可以发现drop(script, export)方法其实质是执行了execute(script, export, true, true)方法。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

生成的sql语句

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

测试create方法

create(script,export)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有两个参数,第一个为true就是把ddl语句输出到控制台,第二个为true就是根据持久类和映射文件先执行删除再执行创建操作,经过调试可以发现这个方法其实质是执行execute(script,export, false, true)方法。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

通过最后一条你也会发现,连视图也生成了。

测试execute方法

execute(script, export, justdrop)方法根据持久类和映射文件先删除架构后再创建删除数据库架构。(nhibernate4.0中已经将第四个参数format去掉了)

有三个参数,第一个为true就是把ddl语句输出到控制台;

第二个为true就是根据持久类和映射文件在数据库中先执行删除再执行创建操作;

第三个为false表示不是仅仅执行drop语句还执行创建操作,这个参数的不同就扩展了上面两个方法;

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

通过比较你会发现execute和create生成的sql语句很相似

测试execute(action&lt;string&gt; scriptaction, bool execute, bool justdrop, textwriter exportoutput)方法

根据持久类和映射文件先删除架构后创建删除数据库架构。有四个参数。

第一个为一个带一个字符串类型输入参数的委托方法。

第二个为true表示对数据库执行ddl。

第三个为true表示如果只有ddl删除数据库对象应该被执行。

第四个为一个textwriter输出到一个textwriter中。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

测试

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

 schemaupadte使用

原来的映射文件product.hbm.xml。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

修改映射文件,添加一个库存量的字段。

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

测试,在数据层添加一个类schemaupdatefixture

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

查看生成的数据表tb_product

[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

细心的你可能会发现,我们在修改过映射文件后并没有修改对应的持久化类。通过schemaupdate(_cfg)你就会发现,初始化该工具的时候只是加载对应的配置文件,跟持久化类并没关系,不过为了对应关系,还是在修改过映射文件后,将添加的或者删除的字段,在持久化类中修改一下,以免忘记,造成打错。

本篇文章通过实例介绍nhibernate中提供的两个实用工具schemaexport如何利用持久化类和映射文件生成数据库架构。本篇文章就介绍到这里。

博客地址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

博客版权:

本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。

如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!

再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/4101214.html