日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图

發(fā)布時(shí)間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

寫在前面

文檔與系列文章

表及其約束

存儲過程

視圖

總結(jié)

寫在前面

由于一直在山西出差,有幾天沒更新博客了。昨晚回到家,將博客園最近三天更新的文章搜集了一下,花費(fèi)了半天的時(shí)間,看了看,有些文章也只能先躺在收藏夾里,慢慢去消化了。廢話不多說了,進(jìn)入正題,那么這篇文章就讓我們接著學(xué)習(xí)SchemaExport工具的使用吧,如何使用SchemaExport為表添加約束,生成存儲過程,生成視圖?

文檔與系列文章

[Nhibernate]體系結(jié)構(gòu)

[NHibernate]ISessionFactory配置

[NHibernate]持久化類(Persistent Classes)

[NHibernate]O/R Mapping基礎(chǔ)

[NHibernate]集合類(Collections)映射?

[NHibernate]關(guān)聯(lián)映射

[NHibernate]Parent/Child

[NHibernate]緩存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

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

[NHibernate]基本配置與測試?

[NHibernate]HQL查詢?

[NHibernate]條件查詢Criteria Query

[NHibernate]增刪改操作

[NHibernate]事務(wù)

[NHibernate]并發(fā)控制

[NHibernate]組件之依賴對象

[NHibernate]一對多關(guān)系(級聯(lián)刪除,級聯(lián)添加)

[NHibernate]一對多關(guān)系(關(guān)聯(lián)查詢)

[NHibernate]多對多關(guān)系(關(guān)聯(lián)查詢)

[NHibernate]延遲加載

[NHibernate]立即加載

[NHibernate]視圖處理

[NHibernate]N+1 Select查詢問題分析

[NHibernate]存儲過程的使用(一)

[NHibernate]存儲過程的使用(二)

[NHibernate]存儲過程的使用(三)

[Nhibernate]SchemaExport工具的使用(一)——通過映射文件修改數(shù)據(jù)表

表及其約束

通過上篇文章我們已經(jīng)知道SchemaEport工具是根據(jù)映射文件來生成數(shù)據(jù)庫的,在映射文件中通過Class映射可以很方便的生成數(shù)據(jù)庫表。為了更清楚的說明,這篇文章我們新建兩個(gè)實(shí)體類CategorySchema和ProductSchema,他們是一對多的關(guān)系。

實(shí)體類代碼

1 /// <summary> 2 /// 描述:SchemaExport工具測試用目錄實(shí)體,數(shù)據(jù)庫持久化類 3 /// 創(chuàng)建人:wolfy 4 /// 創(chuàng)建時(shí)間:2014-10-16 5 /// </summary> 6 public class CategorySchema 7 { 8 /// <summary> 9 /// 目錄標(biāo)識 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工具測試用商品實(shí)體,數(shù)據(jù)庫持久化類 19 /// 創(chuàng)建人:wolfy 20 /// 創(chuàng)建時(shí)間:2014-10-16 21 /// </summary> 22 public class ProductSchema 23 { 24 /// <summary> 25 /// 商品標(biāo)識 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語句

通過查看生成的語句,你會(huì)發(fā)現(xiàn)都按默認(rèn)的值生成了表,Name列字符串類型NVARCHAR(255),默認(rèn)為null;外鍵默認(rèn)一數(shù)字字符串等。

設(shè)置非空類型和長度

在映射文件中為ProductSchema實(shí)體的Name屬性添加:not-null="true"表示非空類型,length="50":列長度設(shè)置為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))

設(shè)置外鍵約束

在映射文件設(shè)置外鍵名稱,注意有的需要兩邊都要設(shè)置才生效,代碼片段如下:

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語句也看到生成的外鍵名稱為映射文件中設(shè)置的名稱,如果在映射文件中不設(shè)置,則生成的外鍵名稱為FK+隨機(jī)的數(shù)字和字母字符串。
設(shè)置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約束,同時(shí)為兩個(gè)屬性設(shè)置unique-key約束。設(shè)置跟unique約束類似,不再舉例了。

設(shè)置索引Index

<property name="Name" not-null="true" length="50" unique="true" index="INX_Prodcut_Name"/>

生成的sql語句

create index INX_Prodcut_Name on ProductSchema (Name)

設(shè)置check約束

我們?yōu)閁nitsOnStock值設(shè)置大于等于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元素用來創(chuàng)建和刪除數(shù)據(jù)庫對象。

語法格式

1 <database-object> 2 <create>創(chuàng)建存儲過程或視圖語句等數(shù)據(jù)庫對象</create> 3 <drop>刪除存儲過程或視圖語句等數(shù)據(jù)庫對象</drop> 4 </database-object>

那么現(xiàn)在我們創(chuàng)建一個(gè)查詢ProductSchema表的存儲過程

<database-object><create>CREATE PROCEDURE QueryProdcutSchemaASSELECT ID,Name FROM ProductSchema</create><drop>QueryProdcutSchema</drop></database-object>

<databse-object>節(jié)點(diǎn)與class節(jié)點(diǎn)同一級別。

生成的存儲過程如下圖

視圖

在之前的篇章中,我們創(chuàng)建了VW_CusomterOrder這樣的視圖。那我們現(xiàn)在通過映射文件創(chuàng)建視圖,修改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>

測試,會(huì)有如下異常

?生成的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語句發(fā)現(xiàn)NHibernate利用Class映射自動(dòng)生成了VW_CusomterOrder表,因?yàn)镹Hibernate見到Class映射就認(rèn)為是表,它不知道這里映射的是視圖,視圖和表在映射文件中沒有什么區(qū)別。我們修改一下這個(gè)映射文件,在database-object元素上面再添加一個(gè)database-object用于刪除NHibernate生成的表。

<database-object><create> drop table VW_CusomterOrder </create><drop>drop table VW_CusomterOrder</drop></database-object>

這個(gè)database-object的意思就是在創(chuàng)建數(shù)據(jù)庫架構(gòu)時(shí)刪除NHibernate自動(dòng)生成的表VW_CusomterOrder,在刪除數(shù)據(jù)庫架構(gòu)時(shí)刪除表VW_CusomterOrder。

總結(jié)

這篇文章主要介紹了使用SchemaExport工具使用映射文件生成數(shù)據(jù)表約束,存儲過程,視圖等操作。關(guān)于SchemaExport工具的使用也算完成了。

總結(jié)

以上是生活随笔為你收集整理的[Nhibernate]SchemaExport工具的使用(二)——创建表及其约束、存储过程、视图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。