zoukankan      html  css  js  c++  java
  • [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图

    目录

    写在前面

    文档与系列文章

    表及其约束

    存储过程

    视图

    总结

    写在前面

    由于一直在山西出差,有几天没更新博客了。昨晚回到家,将博客园最近三天更新的文章搜集了一下,花费了半天的时间,看了看,有些文章也只能先躺在收藏夹里,慢慢去消化了。废话不多说了,进入正题,那么这篇文章就让我们接着学习SchemaExport工具的使用吧,如何使用SchemaExport为表添加约束,生成存储过程,生成视图?

    文档与系列文章

    [Nhibernate]体系结构

    [NHibernate]ISessionFactory配置

    [NHibernate]持久化类(Persistent Classes)

    [NHibernate]O/R Mapping基础

    [NHibernate]集合类(Collections)映射 

    [NHibernate]关联映射

    [NHibernate]Parent/Child

    [NHibernate]缓存(NHibernate.Caches)

    [NHibernate]NHibernate.Tool.hbm2net

    [NHibernate]Nullables

    [NHibernate]Nhibernate如何映射sqlserver中image字段

    [NHibernate]基本配置与测试 

    [NHibernate]HQL查询 

    [NHibernate]条件查询Criteria Query

    [NHibernate]增删改操作

    [NHibernate]事务

    [NHibernate]并发控制

    [NHibernate]组件之依赖对象

    [NHibernate]一对多关系(级联删除,级联添加)

    [NHibernate]一对多关系(关联查询)

    [NHibernate]多对多关系(关联查询)

    [NHibernate]延迟加载

    [NHibernate]立即加载

    [NHibernate]视图处理

    [NHibernate]N+1 Select查询问题分析

    [NHibernate]存储过程的使用(一)

    [NHibernate]存储过程的使用(二)

    [NHibernate]存储过程的使用(三)

    [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工具的使用也算完成了。

  • 相关阅读:
    jsp第六周作业
    jsp第四周作业
    jsp第一周周作业
    第一次软件测试课堂练习
    4.11jsp
    第六周作业
    第三周jsp作业
    3.10 jsp作业
    3.4软件测试
    JSP第六周作业
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/4114870.html
Copyright © 2011-2022 走看看