转载 博客园neekey:http://www.cnblogs.com/neekey/archive/2010/05/20/1739954.html
如果使用Nhibernate,最好在搭配一个SchemaExport生成工具,SchemaExport是根据你创建的实体类和映射文件来自动生成数据库表的工具(方法)。也许你奇怪为什么不是先创建表呢,因为这不符合面向对象。按照面向对象的理解应该是先有对象模型,然后在生成数据库关系模型,而不是根据数据库来创建对象模型。你连对象都没有哪来的表呢。
不过这篇文章比较简单,主要简单介绍2款工具,MyGeneration(这里下载)和SchemaExport(自带)。
MyGeneration是根据大家的喜好,用表生成实体类和映射文件的工具,使用方法如下:
第一次运行会要你配置连接串,手写或点击OLEDB设置都可以,写好后点击SAVE即可。
然后我们点击菜单栏的第三个按钮会出现左边的那个列表,我们点击列表顶部的那个地球,进行下载新的模板:
然后我们找到Nhibernate项shape1.4进行Sava,即可下载。
再右键执行Nhibernate下的那个模板,可以看到我们的数据库的表,右边的Unmap是不映射Map是映射,看颜色可以区分。
配置好后再点击options选项卡,配置红色部分ASSEMBLY/NAMESPACE是程序集/命名空间,IDE没有2008就选2005,然后是输出路径,点击OK,别点保存。
这样工具就会帮你生成对应的实体类和映射文件,如下。
最后,嵌入到你的项目中,在根据你的项目进行简单配置一下就行了。
以上是根据表来创建实体类和映射文件,接下来是根据映射文件和实体类创建表。
我们用到了SchemaExport工具,这个是Nhibernate自带的,但需要引用NHibernate.Tool.hbm2ddl命名空间。
使用方法很简单:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
然后前台调用SetupContext和CreateTest方法,nhibernate就会根据你的配置文件中的连接串自动生成实体类和映射文件相关的数据库表。
其中:Create(script,export)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件先执行删除再执行创建操作,经过调试可以发现这个方法其实质是执行Execute(script,export, false, true)方法
除了Create还有Drop:
Drop(script, export)方法根据持久类和映射文件执行删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件执行删除数据库架构操作,经过调试可以发现Drop(script, export)方法其实质是执行了Execute(script, export, true, true)方法。
Execute:
Execute(script, export, justDrop, format)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有四个参数,第一个为True就是把DDL语句输出到控制台;第二个为True就是根据持久类和映射文件在数据库中先执行删除再执行创建操作;第三个为false表示不是仅仅执行Drop语句还执行创建操作,这个参数的不同就扩展了上面两个方法;第四个参数为false表示不是格式化输出DDL语句到控制台,是在一行输出的。
Execute(script, export, justDrop, format, connection, exportOutput)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有六个参数,第一个为True就是把DDL语句输出到控制台;第二个为false就是不执行DDL语句;第五个为自定义连接。当export为true执行语句时必须打开连接。该方法不关闭连接,null就是使用默认连接,最后一个参数自定义输出
以上就是SchemaExport的几个常用方法,不过注意一点,映射文件最好写成下面的样子:
<property name="Name" not-null="true" length="50" unique="true"/>
这样才能生成更加符合你需要的数据库表,非空、长度、唯一。
当然,除了上面这些,还可以自动生成存储过程,视图,约束。。。,这里我就不写,我主要是学习Nhibernate,文章也不是我原创,大多数都是李永京老师的,我只是把李永京老师说的不详细的地方补足,在加上我自己观点,如果想要更详细的SchemaExport用法,大家看李永京老师的博客吧: