NHibernate之旅(20):再探SchemaExport工具使用(
本节内容[*]引入
[*]实例分析
[*]1.表及其约束
[*]2.存储过程、视图
[*]结语
引入
上篇我们初步探索了SchemaExport工具使用,知道如何使用SchemaExport工具和SchemaUpdate工具利用NHibernate持久化类和映射文件删除、创建、更新数据库架构,这篇具体分析如何为表字段增加一些约束?如何生成存储过程?如何生成视图?使用SchemaExport工具帮你搞定。
实例分析
1.表及其约束
众所周知,SchemaExport工具根据映射文件来生成数据库架构,在映射文件中通过Class映射可以很方便的生成数据库表。但是这篇我们看看映射的条件,所以我重新定义两个实体CategorySchema和ProductSchema,一对多关系。
Step1:两个实体持久化类编写代码如下:
public class CategorySchema
{
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual Guid Id { get; set; }
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual string Name { get; set; }
}
public class ProductSchema
{
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual Guid Id { get; set; }
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual string Name { get; set; }
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual int UnitsOnStock { get; set; }
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>public virtual CategorySchema CategorySchema { get; set; }
}Step2:为两个实体映射,使用最简方式,编写代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> assembly="DomainModel" namespace="DomainModel">
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><class name="DomainModel.Entities.CategorySchema,DomainModel">
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><id name="Id">
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><generator class="guid"/>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property></id>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="Name"/>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property></class>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><class name="DomainModel.Entities.ProductSchema,DomainModel">
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><id name="Id">
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><generator class="guid"/>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property></id>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="Name"/>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><many-to-one name="CategorySchema"
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> class="DomainModel.Entities.CategorySchema,DomainModel"/>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property></class>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>
</hibernate-mapping>Step3:编写测试用例用于生成数据库架构:
public void ExecuteSchemaTest()
{
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>var export = new SchemaExport(_cfg);
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>export.Execute(true, true, false, true);
}Step4:测试!NHibernate生成语句如下:
if exists (select 1 from sys.objects
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> where object_id = OBJECT_ID(N'')
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> AND parent_object_id = OBJECT_ID('ProductSchema'))
alter table ProductSchema<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>drop constraint FK45BBFB51BC9515A6
if exists (select * from dbo.sysobjects
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> where id = object_id(N'ProductSchema')
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> and OBJECTPROPERTY(id, N'IsUserTable') = 1)
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> drop table ProductSchema
if exists (select * from dbo.sysobjects
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> where id = object_id(N'CategorySchema')
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> and OBJECTPROPERTY(id, N'IsUserTable') = 1)
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> drop table CategorySchema
create table ProductSchema (
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Id UNIQUEIDENTIFIER not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Name NVARCHAR(255) null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CategorySchema UNIQUEIDENTIFIER null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (Id)
)
create table CategorySchema (
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Id UNIQUEIDENTIFIER not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Name NVARCHAR(255) null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (Id)
)
alter table ProductSchema add constraint FK45BBFB51BC9515A6
foreign key (CategorySchema) references CategorySchema仔细看看生成的语句,都按默认的值生成了表,Name列字符串类型NVARCHAR(255),默认为null;外键默认一数字字符串等。
1.设置非空类型和长度
在映射文件中为ProductSchema实体的Name属性添加:not-null="true"表示非空类型,length="50":列长度设置为50,代码片段如下:
测试,生成语句如下:
create table ProductSchema (
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Id UNIQUEIDENTIFIER not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> <strong>Name NVARCHAR(50) not null,</strong>
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CategorySchema UNIQUEIDENTIFIER null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (Id)
)2.设置外键Foreign Keys
在映射文件设置外键名称,注意有的需要两边都要设置才生效,代码片段如下:
生成语句如下:
if exists (select 1 from sys.objects
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> where object_id = OBJECT_ID(N'')
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> AND parent_object_id = OBJECT_ID('ProductSchema'))
alter table ProductSchema<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>drop constraint FK_Product_Category
...
alter table ProductSchema add constraint FK_Product_Category
foreign key (CategorySchema) references CategorySchema3.设置Unique约束
我们要求Name字段唯一,添加Unique约束,代码片段如下:
生成语句如下:
create table ProductSchema (
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Id UNIQUEIDENTIFIER not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Name NVARCHAR(50) not null unique,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CategorySchema UNIQUEIDENTIFIER null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (Id)
)还有一种unique-key约束,同时为两个属性设置unique-key约束。我们为Customer持久化类的FirstName和LastName属性添加Unique约束:
编写映射,设置FirstName和LastName的Unique约束为UK_Person_Name:
生成语句如下:
create table Customer(
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CustomerId INT IDENTITY not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> FirstName NVARCHAR(50) not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> LastName NVARCHAR(50) not null,
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (CustomerId),
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> unique (FirstName, LastName)
)4.设置索引Index
生成语句如下:
create table ProductSchema (Id UNIQUEIDENTIFIER...)
create table CategorySchema (Id UNIQUEIDENTIFIER...)
create index IDX_Product_Name on ProductSchema (Name)5.设置Check约束
我们为UnitsOnStock值设置大于等于0:
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>生成语句如下:
create table ProductSchema (<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Id UNIQUEIDENTIFIER not null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Name NVARCHAR(50) not null unique,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> UnitsOnStock INT null check( UnitsOnStock >= 0) ,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CategorySchema UNIQUEIDENTIFIER null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (Id))好了,还有很多设置大家自己探索啦!知道了这些我们在写映射的时候就注意啦!我之前映射文件属性映射为什么写的比较全呢?就是这个原因,便于生成数据库架构是自己约束的并不是默认的。
2.存储过程、视图
除了表,我们还有存储过程和视图。怎么利用SchemaExport工具生成存储过程和视图呢?在映射文件中提供了database-object元素用来创建和删除数据库对象。
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>创建存储过程或视图语句等数据库对象<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>删除存储过程或视图语句等数据库对象1.存储过程
还记得我们在NHibernate之旅(17):探索NHibernate中使用存储过程(下)中创建的三个存储过程了吗?当时我们在数据库中手写创建的啊。现在完全可以不用那种古老的方法啦。我们在映射文件中编写database-object:在创建数据库架构时创建名为entitySProcs的存储过程,在删除数据库架构时删除名为entitySProcs的存储过程。现在使用SchemaExport工具不仅仅生成了表,还生成了存储过程。还剩两个存储过程就留给大家去完成吧。
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>CREATE PROCEDURE entitySProcs<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> AS<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> SELECT CustomerId,Version,Firstname,Lastname FROM Customer<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> DROP PROCEDURE entitySProcs<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>2.视图
还记得我们在NHibernate之旅(14):探索NHibernate中使用视图中创建了第一个视图了吗?那时我们也是在数据库中手动创建的,现在我们可以自动创建了!打开CustomerView.hbm.xml文件,添加database-object:在创建数据库架构时创建名为viewCustomer的视图,在删除数据库架构时删除名为viewCustomer的视图。
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>CREATE VIEW .<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>AS<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>SELECT DISTINCT c.CustomerId, c.Firstname, c.Lastname, o.OrderId, o.OrderDate<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>FROM<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> dbo.Customer AS c INNER JOIN<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>dbo. AS o ON c.CustomerId = o.OrderId INNER JOIN<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>dbo.OrderProduct AS op ON o.OrderId = op. INNER JOIN<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>dbo.Product AS p ON op.Product = p.ProductId<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>GROUP BY c.CustomerId, c.Firstname, c.Lastname, o.OrderId, o.OrderDate<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property><property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>drop view dbo.viewCustomer测试生成数据库架构,出现错误“数据库中已存在名为'viewCustomer'的对象”。这是什么原因呢?看看NHibernate生成语句:
create table viewCustomer (<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> CustomerId INT IDENTITY NOT NULL,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Firstname NVARCHAR(255) null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> Lastname NVARCHAR(255) null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> OrderId INT null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> OrderDate DATETIME null,<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property> primary key (CustomerId))观察NHibernate生成SQL语句发现NHibernate利用Class映射自动生成了viewCustomer表,因为NHibernate见到Class映射就认为是表,它不知道这里映射的是视图,视图和表在映射文件中没有什么区别。我们修改一下这个映射文件,在database-object元素上面再添加一个database-object用于删除NHibernate生成的表。
<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>drop table dbo.viewCustomer<property name="UnitsOnStock" not-null="true" >
<column name="UnitsOnStock" check="UnitsOnStock >= 0"/>
</property>drop table dbo.viewCustomer这个database-object的意思就是在创建数据库架构时删除NHibernate自动生成的表viewCustomer,在删除数据库架构时删除表viewCustomer。为什么删除两次呢?因为我们有可能只Drop,那么NHibernate就执行database-object中的Drop。
这样在CustomerView.hbm.xml文件中就有两个database-object了,总体的意思就是在创建数据库架构时删除NHibernate自动生成的表viewCustomer并创建名为viewCustomer的视图,在删除数据库架构时删除名为viewCustomer表和名为viewCustomer的视图。
结语
好了,终于把SchemaExport工具研究透彻了,应该没有说漏别的东西,就到这里了。下面看看NHibernate对象去,什么状态啦,缓存啦。
本系列链接:NHibernate之旅系列文章导航
NHibernate Q&A
[*]欢迎加入NHibernate中文社区,一起讨论NHibernate知识!
[*]请到NHibernate中文社区下载本系列相关源码。
下次继续分享NHibernate!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]