目录
写在前面
由于一直在山西出差,有几天没更新博客了。昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章也只能先躺在收藏夹里,慢慢去消化了。废话不多说了,进入正题,那么这篇文章就让我们接着学习SchemaExport工具的使用吧,如何使用SchemaExport为表添加约束,生成存储过程,生成视图?
文档与系列文章
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
[NHibernate]条件查询Criteria Query
[Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
表及其约束
通过上篇文章我们已经知道SchemaEport工具是根据映射文件来生成数据库的,在映射文件中通过Class映射可以很方便的生成数据库表。为了更清楚的说明,这篇文章我们新建两个实体类CategorySchema和ProductSchema,他们是一对多的关系。
实体类代码
1 /// <summary> 2 /// 描述:SchemaExport工具测试用目录实体,数据库持久化类 3 /// 创建人:wolfy 4 /// 创建时间:2014-10-16 5 /// </summary> 6 public class CategorySchema 7 { 8 /// <summary> 9 /// 目录标识 10 /// </summary> 11 public virtual Guid ID { get; set; } 12 /// <summary> 13 /// 目录名称 14 /// </summary> 15 public virtual string Name { get; set; } 16 } 17 /// <summary> 18 /// 描述:SchemaExport工具测试用商品实体,数据库持久化类 19 /// 创建人:wolfy 20 /// 创建时间:2014-10-16 21 /// </summary> 22 public class ProductSchema 23 { 24 /// <summary> 25 /// 商品标识 26 /// </summary> 27 public virtual Guid ID { get; set; } 28 /// <summary> 29 /// 商品名称 30 /// </summary> 31 public virtual string Name { get; set; } 32 /// <summary> 33 /// 存储单元 34 /// </summary> 35 public virtual int UnitsOnStock { get; set; } 36 /// <summary> 37 /// 所属目录 38 /// </summary> 39 public virtual CategorySchema CategorySchema { get; set; } 40 }
编写映射文件
ProductSchema.hbm.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 3 assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities"> 4 <class name="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain"> 5 <id name="ID" type="Guid" unsaved-value="null"> 6 <column name="ID" sql-type="uniqueidentifier" not-null="true" unique="true" /> 7 <generator class="assigned"></generator> 8 </id> 9 <property name="Name"/> 10 <many-to-one name="CategorySchema" 11 class="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain"/> 12 </class> 13 </hibernate-mapping>
CategorySchema.hbm.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 3 assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities"> 4 <class name="Wolfy.Shop.Domain.Entities.CategorySchema,Wolfy.Shop.Domain"> 5 <id name="ID" type="Guid" unsaved-value="null"> 6 <column name="ID" sql-type="uniqueidentifier" not-null="true" unique="true" /> 7 <generator class="assigned"></generator> 8 </id> 9 <property name="Name"/> 10 </class> 11 </hibernate-mapping>
在SchemaExportFixture类中添加测试代码
public void ExecuteSchemaTest() { var export = new SchemaExport(_cfg); export.Execute(true, true, false); }
生成的sql语句
通过查看生成的语句,你会发现都按默认的值生成了表,Name列字符串类型NVARCHAR(255),默认为null;外键默认一数字字符串等。
设置非空类型和长度
在映射文件中为ProductSchema实体的Name属性添加:not-null="true"表示非空类型,length="50":列长度设置为50,代码片段如下:
<property name="Name" not-null="true" length="50"/>
测试,生成的sql语句如下
1 create table ProductSchema 2 (ID uniqueidentifier not null unique, 3 Name NVARCHAR(50) not null, 4 CategorySchema UNIQUEIDENTIFIER null, 5 primary key (ID))
设置外键约束
在映射文件设置外键名称,注意有的需要两边都要设置才生效,代码片段如下:
1 <many-to-one name="CategorySchema" 2 class="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain" 3 foreign-key="FK_CategorySchema_ProductSchema" />
测试,生成的sql语句如下
1 alter table ProductSchema add constraint FK_CategorySchema_ProductSchema foreign key (CategorySchema) references ProductSchema
通过sql语句也看到生成的外键名称为映射文件中设置的名称,如果在映射文件中不设置,则生成的外键名称为FK+随机的数字和字母字符串。
设置Unique约束
我们要求Name字段唯一,添加Unique约束,代码片段如下:
1 <property name="Name" not-null="true" length="50" unique="true"/>
生成的sql为
1 create table ProductSchema 2 (ID uniqueidentifier not null unique, 3 Name NVARCHAR(50) not null unique, 4 CategorySchema UNIQUEIDENTIFIER null, 5 primary key (ID))
还有一种unique-key约束,同时为两个属性设置unique-key约束。设置跟unique约束类似,不再举例了。
设置索引Index
<property name="Name" not-null="true" length="50" unique="true" index="INX_Prodcut_Name"/>
生成的sql语句
create index INX_Prodcut_Name on ProductSchema (Name)
设置check约束
我们为UnitsOnStock值设置大于等于0
<property name="UnitsOnStock" not-null ="true"> <column name="UnitsOnStock" check="UnitsOnStock>=0"></column> </property>
生成的sql
1 create table ProductSchema 2 (ID uniqueidentifier not null unique, 3 Name NVARCHAR(50) not null unique, 4 UnitsOnStock INT null check( UnitsOnStock>=0) , 5 CategorySchema UNIQUEIDENTIFIER null, primary key (ID))
存储过程
在映射文件中提供了database-object元素用来创建和删除数据库对象。
语法格式
1 <database-object> 2 <create>创建存储过程或视图语句等数据库对象</create> 3 <drop>删除存储过程或视图语句等数据库对象</drop> 4 </database-object>
那么现在我们创建一个查询ProductSchema表的存储过程
<database-object> <create> CREATE PROCEDURE QueryProdcutSchema AS SELECT ID,Name FROM ProductSchema </create> <drop> QueryProdcutSchema </drop> </database-object>
<databse-object>节点与class节点同一级别。
生成的存储过程如下图
视图
在之前的篇章中,我们创建了VW_CusomterOrder这样的视图。那我们现在通过映射文件创建视图,修改CustomerOrderView.hbm.xml映射文件。
1 <database-object> 2 <create> 3 CREATE VIEW [dbo].[VW_CusomterOrder] 4 AS 5 SELECT c.CustomerID,c.CustomerName 6 FROM dbo.TB_Customer c INNER JOIN 7 dbo.TB_Order o ON c.CustomerID = o.CustomerID INNER JOIN 8 dbo.TB_OrderProduct op ON o.OrderID = op.OrderID INNER JOIN 9 dbo.TB_Product p ON op.ProductID =p.ProductID 10 </create> 11 <drop>drop view dbo.VW_CusomterOrder</drop> 12 </database-object>
测试,会有如下异常
生成的sql
1 create table VW_CusomterOrder 2 (CustomerID uniqueidentifier not null unique, CustomerName NVARCHAR(16) null, CustomerAddress NVARCHAR(128) null, OrderID UNIQUEIDENTIFIER not null, OrderDate DATETIME null, primary key (CustomerID)) 3 4 CREATE VIEW [dbo].[VW_CusomterOrder] 5 AS 6 SELECT c.CustomerID,c.CustomerName 7 FROM dbo.TB_Customer c INNER JOIN 8 dbo.TB_Order o ON c.CustomerID = o.CustomerID INNER JOIN 9 dbo.TB_OrderProduct op ON o.OrderID = op.OrderID INNER JOIN 10 dbo.TB_Product p ON op.ProductID =p.ProductID
观察NHibernate生成SQL语句发现NHibernate利用Class映射自动生成了VW_CusomterOrder表,因为NHibernate见到Class映射就认为是表,它不知道这里映射的是视图,视图和表在映射文件中没有什么区别。我们修改一下这个映射文件,在database-object元素上面再添加一个database-object用于删除NHibernate生成的表。
<database-object> <create> drop table VW_CusomterOrder </create> <drop>drop table VW_CusomterOrder</drop> </database-object>
这个database-object的意思就是在创建数据库架构时删除NHibernate自动生成的表VW_CusomterOrder,在删除数据库架构时删除表VW_CusomterOrder。
总结
这篇文章主要介绍了使用SchemaExport工具使用映射文件生成数据表约束,存储过程,视图等操作。关于SchemaExport工具的使用也算完成了。