本节内容
- 引入
- SchemaExport工具
- SchemaUpdate工具
- 实例分析
- 结语
引入
我其实都是一直先编写持久化类和映射文件,然后使用SchemaExport工具生成数据库架构。这样的方式就是领域驱动设计/开发(DDD,Domain Driven Design/Development)。我的理解是系统的设计应该基于对象模型,主要考虑对象的设计和逻辑上,然后按照对象模型建立数据库关系模型,这才是现在面向对象开发的步骤,并不是上一篇先设计数据库然后再设计对象。用一幅图可以形象的说明领域驱动设计:
当在设计时,我们的领域模型需要改变,只需修改NHibernate结构和应用程序,不需要修改数据库架构,只要利用SchemaExport工具重新生成数据库架构就可以了。但是使用数据库只是其中一种方式,我们也可以使用XML文件来存储数据。
SchemaExport工具
NHibernate的hbm2dll提供SchemaExport工具:给定一个连接字符串和映射文件,不需输入其他东西就可以按照持久化类和映射文件自动生成数据库架构,现在SchemaExport工具还不是很强大,但是一般应用足够了,它还是一个相当原始的API还在不断改进。
SchemaExport工具就是把DDL脚本输出到标准输出,同时/或者执行DDL语句。SchemaExport工具提供了三个方法,分别是Drop()、Create()、Execute(),前两个方法实质是调用Execute()方法。通常使用Execute()方法来生成数据库架构的。
SchemaUpdate工具
在NHibernate2.0中新添加SchemaUpdate工具,可以用来更新数据库架构。但是我觉得没有什么作用,因为它不能Drop现有的表或列,也不能更新现有的列,只能添加新的表和列。如果我需要删除表或者列或者修改其中列,SchemaUpdate工具就显得无能为力了。
实例分析
知道了上面的知识就好好实战一下:看看具体怎么使用呢?
1.SchemaExport工具实战
通常我们使用生成数据库架构代码实例像这样:
Configuration cfg=new Configuration(); cfg.Configure(); SchemaExport export =new SchemaExport(cfg); export.Execute(....);
1.准备工作
现在数据访问测试层新建一SchemaExportFixture.cs文件用于测试生成实战。声明一个全局变量_cfg,编写[SetUp]方法在每个测试方法执行之前调用:
[TestFixture] public class SchemaExportFixture { private Configuration _cfg; [SetUp] public void SetupContext() { _cfg = new Configuration(); _cfg.Configure(); } //测试...... }
2.测试Drop(script, export)方法
[Test] public void DropTest() { var export = new SchemaExport(_cfg); export.Drop(true, true); }
Drop(script, export)方法根据持久类和映射文件执行删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件执行删除数据库架构操作,经过调试可以发现Drop(script, export)方法其实质是执行了Execute(script, export, true, true)方法。
3.测试Create(script, export)方法
[Test] public void CreateTest() { var export = new SchemaExport(_cfg); export.Create(true, true); }
Create(script,export)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有两个参数,第一个为True就是把DDL语句输出到控制台,第二个为True就是根据持久类和映射文件先执行删除再执行创建操作,经过调试可以发现这个方法其实质是执行Execute(script,export, false, true)方法。
4.测试Execute(script, export, justDrop, format)方法
[Test] public void ExecuteTest() { var export = new SchemaExport(_cfg); export.Execute(true, true, false, false); }
Execute(script, export, justDrop, format)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有四个参数,第一个为True就是把DDL语句输出到控制台;第二个为True就是根据持久类和映射文件在数据库中先执行删除再执行创建操作;第三个为false表示不是仅仅执行Drop语句还执行创建操作,这个参数的不同就扩展了上面两个方法;第四个参数为false表示不是格式化输出DDL语句到控制台,是在一行输出的。
所谓格式化输出就像这样:
一行输出就像这样:
5.测试Execute(script, export, justDrop, format, connection, exportOutput)方法
[Test] public void ExecuteOutTest() { var export = new SchemaExport(_cfg); var sb = new StringBuilder(); TextWriter output = new StringWriter(sb); export.Execute(true, false, false, false, null, output); }
Execute(script, export, justDrop, format, connection, exportOutput)方法根据持久类和映射文件先删除架构后创建删除数据库架构。有六个参数,第一个为True就是把DDL语句输出到控制台;第二个为false就是不执行DDL语句;第五个为自定义连接。当export为true执行语句时必须打开连接。该方法不关闭连接,null就是使用默认连接,最后一个参数自定义输出,这里我输出到TextWriter中。
2.SchemaUpdate工具实战
现在数据访问测试层新建一SchemaUpdateFixture.cs文件用于测试生成实战。先声明一个全局变量_cfg:
private Configuration _cfg;
这里我用另外一种方式配置映射文件,先定义两个映射XML分别代表旧的和新的这样才能体现测试更新数据库架构的意义。
旧映射XML:这里我使用Product持久化类,由于在之前我们定义了Product持久化类,这里直接模拟定义映射XML:拥有主键ProductId和Name字段。
public const string product_xml = "<?xml version='1.0' encoding='utf-8' ?>" + "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'" + " assembly='DomainModel'" + " namespace='DomainModel'>" + " <class name='DomainModel.Entities.Product,DomainModel'>" + " <id name='ProductId'>" + " <generator class='native'/>" + " </id>" + " <property name='Name'/>" + " </class>" + "</hibernate-mapping>";
新映射XML:更新上面映射XML:主键ProductId(没有改变);Name字段:添加不可为空和长度为50;另外增加了Cost字段,类型为float不可为空。
public const string newproduct_xml = "<?xml version='1.0' encoding='utf-8' ?>" + "<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'" + " assembly='DomainModel'" + " namespace='DomainModel'>" + " <class name='DomainModel.Entities.Product,DomainModel'>" + " <id name='ProductId'>" + " <generator class='native'/>" + " </id>" + " <property name='Name' not-null='true' length='50' />" + " <property name='Cost' type='float' not-null='true'/>" + " </class>" + "</hibernate-mapping>";
测试前利用旧映射XML创建数据库架构:使用[SetUp]在测试前执行,按照旧映射XML创建数据库架构并格式化输出DDL语句:
[SetUp] public void SetupContext() { //模拟旧系统 _cfg = new Configuration(); _cfg.Configure(); _cfg.AddXml(product_xml); var export = new SchemaExport(_cfg); export.Execute(true, true, false, true); }
测试更新数据库架构:使用SchemaUpdate类提供的唯一的Execute(script, doUpdate)方法按照新映射XML更新数据库架构:
[Test] public void UpdateExistingDatabaseSchemaTest() { _cfg = new Configuration(); _cfg.Configure().AddXml(newproduct_xml); var update = new SchemaUpdate(_cfg); update.Execute(true, true); }
测试输出结果如图所示,如果你觉得不放心再看看数据库Product表。
看到了吗?这显然不是我要求的,首先按照旧映射XML创建了数据库架构,但是更新数据库架构显得无能为力,仅仅增加了Cost字段,我想更新Name字段属性为不可为空和长度为50,但是SchemaUpdate工具不能做到!我觉得这个类目前还没有什么作用,期待下一个版本来完善。
结语
这篇文章通过实例介绍NHibernate中提供两个实用工具SchemaExport工具利用持久化类和映射文件生成数据库架构。SchemaUpdate工具通过持久化类和映射文件更新数据库架构。
相关推荐
NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。 ...
5. 初始化数据库:在应用程序启动时,可以使用 NHibernate 的工具(如 SchemaExport 类)根据映射文件自动生成数据库结构。 6. 使用 NHibernate:在代码中,通过 SessionFactory 创建 Session 对象,进而进行 CRUD...
本文将详细介绍如何在ASP.NET环境中使用Nhibernate构建一个多层架构的实例。 首先,我们来看**Nhibernate**本身。Nhibernate是一个开源的ORM框架,它允许开发人员使用面向对象的方式来处理数据库操作,消除了SQL...
nHibernate作为ORM框架,使得开发人员可以在.NET应用程序中使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。它通过映射对象到数据库表,实现了数据层和业务层的解耦。nHibernate提供了丰富的特性,如...
**Spring.NET:依赖注入容器** Spring.NET是.NET平台上的一个轻量级框架,主要提供依赖注入(DI)和控制反转(IoC)功能,以增强代码的解耦性和可测试性。Spring.NET的核心特性包括: 1. **依赖注入**:通过构造...
NHibernate是.NET平台上的一款流行的ORM(对象关系映射)工具,它允许开发者用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。Spring.NET则是一个全面的企业级应用开发框架,提供了依赖注入、AOP(面向切...
NHibernate是一个流行的对象关系映射(ORM)工具,它允许开发者在.NET平台上将数据库操作与面向对象的代码无缝集成。ASP.NET 2.0是微软Web应用程序开发框架的一个版本,用于构建动态网站和Web应用程序。 **描述分析...
在《NHibernate ASP.NET 2.0 企业级应用案例》这篇文章中,作者Billy McCafferty分享了一系列针对NHibernate 1.2版本与ASP.NET框架结合使用的最佳实践。文章不仅涵盖了如何利用NHibernate进行高效的数据持久化操作,...
在这个项目中,“基于NHibernate框架的ASP.NET论坛”就是一个典型的示例,它展示了如何使用NHibernate这个流行的ORM(对象关系映射)工具在ASP.NET环境中构建一个功能丰富的论坛应用。 【描述】:“基于NHibernate...
5. **HQL(Hibernate Query Language)**:介绍NHibernate特有的查询语言,类似于SQL,但更加面向对象,用于检索和操作数据。 6. **Criteria查询**:提供另一种查询方式,通过构建Criteria对象来执行查询,灵活且...
【标题】"NHibernate+Spring.net+Codesmith" 指的是一个集成开发环境,它结合了三种关键的开发框架,用于构建高效、可维护的.NET应用。在本文中,我们将深入探讨这些技术以及它们如何协同工作。 【NHibernate】是...
在.Net中使用SQLite,还需要一个针对SQLite的ADO.NET Provider,即需要sqlite.net.dll 一切准备就绪后,开始,编译运行,出现问题了,报一个什么finsalConnection无法转变为IDBConnection, 在网上查资料,搞了半天,网上说...
刘冬编写的Spring.NET,NHibernate,ASP.NET MVC例子 原文:http://www.cnblogs.com/GoodHelper/archive/2009/11/19/SpringNet_Nhibernate_AspNetMvc.html
在.NET Core应用中使用NHibernate是一项重要的技术任务,特别是对于那些需要进行高效关系型数据库管理的项目。NHibernate,作为.NET平台上的一个流行的ORM(对象关系映射)框架,允许开发者将业务对象与数据库表之间...
而NHibernate,作为一款流行的ORM(对象关系映射)框架,它在.NET平台上扮演着重要的角色,帮助开发者将.NET应用程序中的对象模型与数据库进行解耦,减少了直接操作SQL语句的工作量。 **一、NHibernate简介** ...
《NHibernate ASP.NET 2.0 企业级应用案例 3/3》是关于使用NHibernate ORM工具在ASP.NET 2.0环境下构建企业级应用的实战教程。本案例不仅展示了NHibernate的强大功能,还融入了许多经典的设计模式,旨在帮助开发者...
.NET中的NHibernate是一个强大的对象关系映射(ORM)框架,它为.NET开发者提供了一种将数据库操作抽象化、简化的方法,使得开发人员可以使用面向对象的编程方式来处理数据库交互,而无需直接编写SQL语句。它在.NET...
3. **NHibernate**:NHibernate是.NET平台上的一款开源的对象关系映射(ORM)工具,它能够将.NET对象模型映射到关系数据库,消除了SQL代码与业务逻辑之间的直接耦合。NHibernate简化了数据访问层的编写,通过HBM...
首先,Nhibernate作为一款流行的ORM(对象关系映射)工具,它在数据库与业务对象之间搭建了一座桥梁,使得开发者无需关注底层SQL语句,即可进行数据操作。Nhibernate通过XML或注解的方式定义实体类与数据库表之间的...