[Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图
目录
写在前面
由于一直在山西出差,有几天没更新博客了。昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章也只能先躺在收藏夹里,慢慢去消化了。废话不多说了,进入正题,那么这篇文章就让我们接着学习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,他们是一对多的关系。
实体类代码
/// <summary>
/// 描述:SchemaExport工具测试用目录实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class CategorySchema
{
/// <summary>
/// 目录标识
/// </summary>
public virtual Guid ID { get; set; }
/// <summary>
/// 目录名称
/// </summary>
public virtual string Name { get; set; }
}
/// <summary>
/// 描述:SchemaExport工具测试用商品实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class ProductSchema
{
/// <summary>
/// 商品标识
/// </summary>
public virtual Guid ID { get; set; }
/// <summary>
/// 商品名称
/// </summary>
public virtual string Name { get; set; }
/// <summary>
/// 存储单元
/// </summary>
public virtual int UnitsOnStock { get; set; }
/// <summary>
/// 所属目录
/// </summary>
public virtual CategorySchema CategorySchema { get; set; }
}
编写映射文件
ProductSchema.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
<class name="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain">
<id name="ID" type="Guid" unsaved-value="null">
<column name="ID" sql-type="uniqueidentifier" not-null="true" unique="true" />
<generator class="assigned"></generator>
</id>
<property name="Name"/>
<many-to-one name="CategorySchema"
class="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain"/>
</class>
</hibernate-mapping>
CategorySchema.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
<class name="Wolfy.Shop.Domain.Entities.CategorySchema,Wolfy.Shop.Domain">
<id name="ID" type="Guid" unsaved-value="null">
<column name="ID" sql-type="uniqueidentifier" not-null="true" unique="true" />
<generator class="assigned"></generator>
</id>
<property name="Name"/>
</class>
</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语句如下
create table ProductSchema
(ID uniqueidentifier not null unique,
Name NVARCHAR(50) not null,
CategorySchema UNIQUEIDENTIFIER null,
primary key (ID))
设置外键约束
在映射文件设置外键名称,注意有的需要两边都要设置才生效,代码片段如下:
<many-to-one name="CategorySchema"
class="Wolfy.Shop.Domain.Entities.ProductSchema,Wolfy.Shop.Domain"
foreign-key="FK_CategorySchema_ProductSchema" />
测试,生成的sql语句如下
alter table ProductSchema add constraint FK_CategorySchema_ProductSchema foreign key (CategorySchema) references ProductSchema
通过sql语句也看到生成的外键名称为映射文件中设置的名称,如果在映射文件中不设置,则生成的外键名称为FK+随机的数字和字母字符串。
设置Unique约束
我们要求Name字段唯一,添加Unique约束,代码片段如下:
<property name="Name" not-null="true" length="50" unique="true"/>
生成的sql为
create table ProductSchema
(ID uniqueidentifier not null unique,
Name NVARCHAR(50) not null unique,
CategorySchema UNIQUEIDENTIFIER null,
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
create table ProductSchema
(ID uniqueidentifier not null unique,
Name NVARCHAR(50) not null unique,
UnitsOnStock INT null check( UnitsOnStock>=0) ,
CategorySchema UNIQUEIDENTIFIER null, primary key (ID))
存储过程
在映射文件中提供了database-object元素用来创建和删除数据库对象。
语法格式
<database-object>
<create>创建存储过程或视图语句等数据库对象</create>
<drop>删除存储过程或视图语句等数据库对象</drop>
</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映射文件。
<database-object>
<create>
CREATE VIEW [dbo].[VW_CusomterOrder]
AS
SELECT c.CustomerID,c.CustomerName
FROM dbo.TB_Customer c INNER JOIN
dbo.TB_Order o ON c.CustomerID = o.CustomerID INNER JOIN
dbo.TB_OrderProduct op ON o.OrderID = op.OrderID INNER JOIN
dbo.TB_Product p ON op.ProductID =p.ProductID
</create>
<drop>drop view dbo.VW_CusomterOrder</drop>
</database-object>
测试,会有如下异常
生成的sql
create table VW_CusomterOrder
(CustomerID uniqueidentifier not null unique, CustomerName NVARCHAR(16) null, CustomerAddress NVARCHAR(128) null, OrderID UNIQUEIDENTIFIER not null, OrderDate DATETIME null, primary key (CustomerID)) CREATE VIEW [dbo].[VW_CusomterOrder]
AS
SELECT c.CustomerID,c.CustomerName
FROM dbo.TB_Customer c INNER JOIN
dbo.TB_Order o ON c.CustomerID = o.CustomerID INNER JOIN
dbo.TB_OrderProduct op ON o.OrderID = op.OrderID INNER JOIN
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工具的使用也算完成了。
[Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图的更多相关文章
- Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间
alter table userInfo add(msn varchar2(20)); 1.建表 create table userInfo ( id number(6), name varchar2 ...
- MySql表、约束、视图
MySql表.约束.视图 索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表成为索引组织表(index organized table). 每张表都有主键,如果创建表 ...
- [Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表
目录 写在前面 文档与系列文章 SchemaExport工具 SchemaUpdate工具 一个例子 总结 写在前面 上篇文章介绍了使用代码生成器的nhibernate模版来生成持久化类,映射文件等内 ...
- 【SQL模板】二.创建表视图模板TSQL
---Name: 创建表视图模板.sql ---Purpose: 用于创建 数据库中 新的数据表/视图 ---Author: xx ---Time: 2015-12-18 10:26:06 ---Re ...
- oracle之子查询、创建用户、创建表、约束
子查询 子查询可以分为单行子查询和多行子查询 单行子查询 [1] 将一个查询的结果作为另外一个查询的条 ...
- PostgreSQL创建表及约束
创建表 语法: create table table_name ( column_name type column_constraint, table_constraint table_constra ...
- oracle之二数据字典表和动态性能视图
数据字典表和动态性能视图 Oracle提供了大量的内部表,它们记录了数据库对象的更改和修正.可以将这些内部表划分为两种主要类型:静态的数据字典表和动态的性能表.这些内部表是由oracle维护的,可以说 ...
- mysql 批量创建表,利用存储过程
最近根据需求,需要提前创建一批日志表,以日期结尾,每天创建一张,例如XXX20160530,请参考如下: BEGIN DECLARE `sName` VARCHAR(128); DECLAR ...
- sql基础语法-创建表和约束
创建数据库表 USE SQL2016 IF OBJECT_ID('dbo.Employees','U') IS NOT NULL DROP TABLE dbo.Employees; Create TA ...
随机推荐
- awk-笔记
语法形式: awk [options] 'script' var=value file1 [file...] awk [options] -f scriptfile var=value file [f ...
- oh-my-zsh主题
什么是ZSH Zsh和bash一样,是一种Unix shell,但大多数Linux发行版本都默认使用bash shell.但Zsh有强大的自动补全参数.文件名.等功能和强大的自定义配置功能. 一.安装 ...
- TAR,JAR,Zip的使用
在文件归档的时候,LINUX中,我常喜欢使用tar,它可以把一个文件夹归档为一个文件,可以同时使用指定的压缩算法把其压缩归档. 最常用的语句是: tar cvzf target.tar.gz sour ...
- 三维网格补洞算法(Radial Basis Function)
在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis ...
- c++中static关键字的用法总结
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- NOIP2012国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在 ...
- Mongodb的安装
下载:http://www.mongodb.org/downloads mongodb-win32-x86_64-3.2.5-signed.msi 安装: 1.dos下切换至安装目录bin下: 2 ...
- AndroidStudio导入Eclipse的代码格式化文件
对于一个团队来说,使用统一的代码格式是非常重要的,否则在使用版本控制工具时,会出现大量的冲突.在Eclipse里,我们可以通过一些xml来进行代码格式的统一,但是这些文件要应用在AndroidStud ...
- 常用Git代码托管服务分享
Git Repository代码托管服务越来越流行,目前有很多商业公司和个人团队逐渐切换项目到 Git平台进行代码托管.本文分享一些常用的Git代码托管服务,其中一些提供私有项目保护服务,特别有利于远 ...