<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設定資料庫連接配接字元串、模闆語言、資料庫驅動、模闆存放路徑等資訊。
然後選擇“save”對預設配置進行儲存。然後mygenration主界面就會彈出。如圖
展開microsoft sql server節點,找到“script insert/update/delete procedures for sql server”模闆,右擊選擇執行,我們利用這個模闆為customer表生成增删改存儲過程。
打開後,這個模闆界面如下,選擇輸出路徑和資料庫表,這裡我輸入路徑為桌面,選擇tb_customer表,點選ok。截圖如下:
此時在桌面“c:\users\wolfy\desktop\customer”中就會生成sql_procs_tb_customer.sql檔案,打開資料庫,然後執行該檔案中的sql腳本。
sql_procs_tb_customer.sql
我使用的是sql server2012的版本,在執行腳本的時候,生成添加customer的存儲過程,有問題
将newid()函數去掉。修改後的存儲過程
生成的存儲過程如下:
在nhibernate的映射檔案中,在class元素中提供了<sql-delete>、<sql-insert>、<sql-update>元素用于删除、建立、更新對象,注意這三個元素順序唯一,就是下圖顯示的順序,在根元素提供了<sql-query>元素用來查詢對象,下圖顯示在class元素中的增删改存儲過程元素。
删除對象
修改映射檔案添加存儲過程,打開customer.hbm.xml映射檔案,在class元素下添加<sql-delete>節點,調用tb_customerdelete存儲過程,tb_customerdelete存儲過程有一個customerid參數,這裡用一個問号表示:
測試
此時會有一個異常“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,代碼片段如下:
再次運作進行測試,測試成功,檢視生成的sql語句
你會發現在sql語句裡面多了一個@p1的參數。這個參數為之前添加的version參數,nhibernate中樂觀并發控制添加的。
如何解決?
修改存儲過程,将版本号添加上。
不要忘了,此時的存儲過程有兩個參數了,版本号在映射檔案中已經處理了,存儲過程中已經幫咱們自動添加上了,如果是其他的參數可在映射檔案通過"?,?..."添加多個參數。
再次運作進行測試,成功,生成的sql語句
當然了,如果你不想使用存儲過程,也可以直接在<sql-delete>中寫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