?
? ?不能快速的保存bug的確是很不爽的事情 ,不僅客戶著急 領導也著急 ,自己也著急。。。。。。。。哈哈
? ?
? ?原來好好的一個平臺 簡單的一個插入記錄 突然就報錯了
? ?錯誤為 could not insert #9521
? ?原來項目是用 NHibernate 做的插入
? ?拋出的異常 真是無法定位到底是什么錯誤啊
? ?于是想打開vs調試下遠程庫?
? ?結果調試過程中 無法查詢變量的值
? ?在調試即時窗口里 ?提示 表達式計算器中發生內部錯誤
? ?郁悶 ?于是重啟vs
? ?又提示 源文件與模塊生成時的不同
? ?網上搜了下解決方案 ?修改 調試 --》 選項 --》 常規里面 去掉 要求源文件與原始版本相匹配 ok 了
? ?調試過程中發現?
? ?-- 錯誤代碼拋出的異常 為 直接的 Exception 查看了下 innerException 結果為
? ?"當 IDENTITY_INSERT 設置為 OFF 時,不能向表 'OrderList' 中的標識列插入顯式值“
? ?理論上來說 這個表的主鍵設置了 自增長,查了下 果然 服務器的表 與 測試的表 不符合 應該是有人改了數據庫,
? ?只能是修改下 hbm.xml 文件 ok ,耗時一個半小時 ,
? ?時間主要浪費在 vs調試 這上面 ,錯誤沒能夠明顯的拋出
? ? 調試錯誤后 順便總結下吧
? ? innerException ?msdn的地址
? ?http://msdn.microsoft.com/zh-cn/library/system.exception.innerexception.aspx
? ? 總的來說 拋出innerException 能更快的定位到錯誤,但并不是每個Exception 都會有 innerException
?
? ?再一個 vs 的 要求源文件與原始版本匹配 ,網上還有一個解決辦法是 刪除bin目錄 重新生成 我沒試
? ?找了下這樣做可以的原因 應該是 pdb文件儲存了項目的調試信息,可能與修改不符合
? ?關于 pdb 文件,還真沒仔細研究過。
? ?pdb 文件 ?http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know
?
? ?nhibernate 主鍵
? ?
(1) assigned
主鍵由外部程序負責生成,無需NHibernate參與。
(2) hilo
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表保存主
鍵生成 歷史狀態。
?
<!--<generator class="hilo">
<param name="table">Tbl_Basic_Identity</param>
<param name="column">ProductVerifyMessageID</param>
<param name="max_lo">0</param>
</generator>-->
?
(3) seqhilo
與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,只是主鍵歷史
狀態保存在Sequence中,適用于支持Sequence的數據庫,如Oracle。
(4) increment
主 鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持
一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候
將此值加1作為 主鍵。
這種方式可能產生的問題是:如果當前有多個實例訪問同一個數據
庫,那么由于各個實例各自維護主鍵狀態,不同實例可能生成同樣
的 主鍵,從而造成主鍵重復異常。因此,如果同一數據庫有多個實
例訪問,此方式必須避免使用。
(5) identity
采用數據庫提供的主鍵生成機制。如DB2、SQL Server、MySQL
中的主鍵 生成機制。
(6) sequence
采用數據庫提供的sequence 機制生成主鍵。如Oralce 中的
Sequence。
(7) native
由 NHibernate根據底層數據庫自行判斷采用identity、hilo、sequence
其中一種作為主鍵生成方式。) uuid.hex
由 Hibernate基于128 位唯一值產生算法生成16 進制數值(編碼后
以長度32 的字符串表示)作為主鍵。
(8) foreign
使用外部表的字段作為主鍵。