天天看點

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t1" target="_blank">寫在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t2" target="_blank">文檔與系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t3" target="_blank">schemaexport工具</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t4" target="_blank">schemaupdate工具</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t5" target="_blank">一個例子</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4101214.html#t6" target="_blank">總結</a>

上篇文章介紹了使用代碼生成器的nhibernate模版來生成持久化類,映射檔案等内容。本篇文章将繼續介紹工具schemaexport和schemaupdate。說實話,這東西我也是第一次使用,也隻能邊摸索,邊學習了。

一般的開發模式是先将資料庫架構設計好,然後再編寫持久化類和映射檔案,也就是資料庫驅動的模式。然而也可以先編寫持久化類和映射檔案,然後通過schemaexport工具生成資料庫架構。通過面向對象的思想,來生成對應的資料庫架構,似乎是更合理的(個人觀點)。

這種先編寫持久化類和映射檔案在生成資料庫架構有什麼好處呢?

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

如果在設計的時候,我們的領域模型需要改變,隻需修改nhibernate結構和應用程式,不需要修改資料庫架構,隻要利用schemaexport工具重新生成資料庫架構就可以了。

<a href="http://www.cnblogs.com/wolf-sun/p/3694592.html">[nhibernate]體系結構</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3694901.html">[nhibernate]isessionfactory配置</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3704012.html">[nhibernate]持久化類(persistent classes)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3705229.html">[nhibernate]o/r mapping基礎</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3720259.html">[nhibernate]關聯映射</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3721528.html">[nhibernate]parent/child</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3724052.html">[nhibernate]緩存(nhibernate.caches)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734249.html">[nhibernate]nhibernate.tool.hbm2net</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3734313.html">[nhibernate]nullables</a>

<a href="http://www.cnblogs.com/wolf-sun/p/3956802.html">[nhibernate]nhibernate如何映射sqlserver中image字段</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4046672.html">[nhibernate]條件查詢criteria query</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4048048.html">[nhibernate]增删改操作</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4049716.html">[nhibernate]事務</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4050714.html">[nhibernate]并發控制</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4067026.html">[nhibernate]元件之依賴對象</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4068749.html">[nhibernate]一對多關系(級聯删除,級聯添加)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4070935.html">[nhibernate]一對多關系(關聯查詢)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4074654.html">[nhibernate]多對多關系(關聯查詢)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4077226.html">[nhibernate]延遲加載</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082432.html">[nhibernate]立即加載</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4082899.html">[nhibernate]視圖處理</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4083402.html">[nhibernate]n+1 select查詢問題分析</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4085314.html">[nhibernate]存儲過程的使用(一)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4088288.html">[nhibernate]存儲過程的使用(二)</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4093539.html">[nhibernate]存儲過程的使用(三)</a>

nhibernate的hbm2dll提供schemaexport工具:給定一個連接配接字元串和映射檔案,不需輸入其他東西就可以按照持久化類和映射檔案自動生成資料庫架構,現在schemaexport工具還不是很強大,但是一般應用足夠了,它還是一個相當原始的api還在不斷改進。 schemaexport工具就是把ddl腳本輸出到标準輸出,同時/或者執行ddl語句。schemaexport工具提供了三個方法,分别是drop()、create()、execute(),前兩個方法實質是調用execute()方法。通常使用execute()方法來生成資料庫架構的。
在nhibernate2.0中新添加schemaupdate工具,可以用來更新資料庫架構。但是我覺得沒有什麼作用,因為它不能drop現有的表或列,也不能更新現有的列,隻能添加新的表和列。如果我需要删除表或者列或者修改其中列,schemaupdate工具就顯得無能為力了。

現在資料通路測試層建立一schemaexportfixture.cs檔案用于測試。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

需要引入命名空間

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

測試drop方法

方法描述

drop(script, export)方法根據持久類和映射檔案執行删除資料庫架構。有兩個參數,第一個為true就是把ddl語句輸出到控制台,第二個為true就是根據持久類和映射檔案執行删除資料庫架構操作,經過調試可以發現drop(script, export)方法其實質是執行了execute(script, export, true, true)方法。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

生成的sql語句

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

測試create方法

create(script,export)方法根據持久類和映射檔案先删除架構後建立删除資料庫架構。有兩個參數,第一個為true就是把ddl語句輸出到控制台,第二個為true就是根據持久類和映射檔案先執行删除再執行建立操作,經過調試可以發現這個方法其實質是執行execute(script,export, false, true)方法。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

通過最後一條你也會發現,連視圖也生成了。

測試execute方法

execute(script, export, justdrop)方法根據持久類和映射檔案先删除架構後再建立删除資料庫架構。(nhibernate4.0中已經将第四個參數format去掉了)

有三個參數,第一個為true就是把ddl語句輸出到控制台;

第二個為true就是根據持久類和映射檔案在資料庫中先執行删除再執行建立操作;

第三個為false表示不是僅僅執行drop語句還執行建立操作,這個參數的不同就擴充了上面兩個方法;

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

通過比較你會發現execute和create生成的sql語句很相似

測試execute(action&lt;string&gt; scriptaction, bool execute, bool justdrop, textwriter exportoutput)方法

根據持久類和映射檔案先删除架構後建立删除資料庫架構。有四個參數。

第一個為一個帶一個字元串類型輸入參數的委托方法。

第二個為true表示對資料庫執行ddl。

第三個為true表示如果隻有ddl删除資料庫對象應該被執行。

第四個為一個textwriter輸出到一個textwriter中。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

測試

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

 schemaupadte使用

原來的映射檔案product.hbm.xml。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

修改映射檔案,添加一個庫存量的字段。

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

測試,在資料層添加一個類schemaupdatefixture

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表
[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

檢視生成的資料表tb_product

[Nhibernate]SchemaExport工具的使用(一)——通過映射檔案修改資料表

細心的你可能會發現,我們在修改過映射檔案後并沒有修改對應的持久化類。通過schemaupdate(_cfg)你就會發現,初始化該工具的時候隻是加載對應的配置檔案,跟持久化類并沒關系,不過為了對應關系,還是在修改過映射檔案後,将添加的或者删除的字段,在持久化類中修改一下,以免忘記,造成打錯。

本篇文章通過執行個體介紹nhibernate中提供的兩個實用工具schemaexport如何利用持久化類和映射檔案生成資料庫架構。本篇文章就介紹到這裡。

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/4101214.html