天天看點

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

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

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

<a href="http://www.cnblogs.com/wolf-sun/p/4085314.html#t3" target="_blank">nhibernate中使用存儲過程</a>

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

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

上篇文章一個小插曲,分析了延遲加載是如何解決n+1 select查詢問題的。這篇開始介紹在nhibernate中如何使用存儲過程,同時也介紹如何使用代碼生成器,提高開發效率。

<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>

安裝完成後,打開mygeneration,如果第一次使用mygeneration會自動彈出“預設設定”對話框,需要你對mygeneration設定資料庫連接配接字元串、模闆語言、資料庫驅動、模闆存放路徑等資訊。

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

然後選擇“save”對預設配置進行儲存。然後mygenration主界面就會彈出。如圖

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

展開microsoft sql server節點,找到“script insert/update/delete procedures for sql server”模闆,右擊選擇執行,我們利用這個模闆為customer表生成增删改存儲過程。

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

打開後,這個模闆界面如下,選擇輸出路徑和資料庫表,這裡我輸入路徑為桌面,選擇tb_customer表,點選ok。截圖如下:

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

此時在桌面“c:\users\wolfy\desktop\customer”中就會生成sql_procs_tb_customer.sql檔案,打開資料庫,然後執行該檔案中的sql腳本。

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

 sql_procs_tb_customer.sql

我使用的是sql server2012的版本,在執行腳本的時候,生成添加customer的存儲過程,有問題

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

将newid()函數去掉。修改後的存儲過程

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

生成的存儲過程如下:

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

在nhibernate的映射檔案中,在class元素中提供了&lt;sql-delete&gt;、&lt;sql-insert&gt;、&lt;sql-update&gt;元素用于删除、建立、更新對象,注意這三個元素順序唯一,就是下圖顯示的順序,在根元素提供了&lt;sql-query&gt;元素用來查詢對象,下圖顯示在class元素中的增删改存儲過程元素。

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

删除對象

修改映射檔案添加存儲過程,打開customer.hbm.xml映射檔案,在class元素下添加&lt;sql-delete&gt;節點,調用tb_customerdelete存儲過程,tb_customerdelete存儲過程有一個customerid參數,這裡用一個問号表示:

測試

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

此時會有一個異常“row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [wolfy.shop.domain.entities.customer#b0720295-9541-40b3-9994-610066224db8]”。這個錯誤是存儲過程寫法錯誤,我們修改tb_customerdelete存儲過程,去掉set nocount on,代碼片段如下:

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

再次運作進行測試,測試成功,檢視生成的sql語句

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

你會發現在sql語句裡面多了一個@p1的參數。這個參數為之前添加的version參數,nhibernate中樂觀并發控制添加的。

如何解決?

修改存儲過程,将版本号添加上。

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

不要忘了,此時的存儲過程有兩個參數了,版本号在映射檔案中已經處理了,存儲過程中已經幫咱們自動添加上了,如果是其他的參數可在映射檔案通過"?,?..."添加多個參數。

再次運作進行測試,成功,生成的sql語句

當然了,如果你不想使用存儲過程,也可以直接在&lt;sql-delete&gt;中寫sql語句,像這樣,照樣用。

生成的sql語句為

這篇文章主要介紹了代碼生成器的簡單使用及nhibernate中使用存儲過程删除資料的過程。

部落格位址:

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

部落格版權:

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

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

再次感謝您耐心的讀完本篇文章。

轉載:http://www.cnblogs.com/wolf-sun/p/4085314.html