上午在寫一個NHibernate的示範Demo是出現一個異常,
{"當 IDENTITY_INSERT 設定為 OFF 時,不能向表 'OrderList' 中的辨別列插入顯式值"}
對于這個異常可以從兩個角度來處理:A:資料庫執行語句 B:直接修改NHibernate中持久化類映射配置檔案id節點
A資料庫執行語句:
問題描述:當在資料庫表主鍵設計為 (Orderid int identity primary key),相對這個主鍵IDENTITY_INSERT預設設定為OFF,就是不能夠顯示插入主鍵id的值,例子如下:
insert into OrderList(id,OrderName) values(4520,'電子傳票訂單')
執行上面語句會提示一個錯誤:
伺服器: 消息 544,級别 16,狀态 1,行 1

當 IDENTITY_INSERT 設定為 OFF 時,不能向表 'OrderList' 中的辨別列插入顯式值。
其中關于主鍵一條記錄,當我們想把這條記錄的id設定成我們自定義的4520時出現上面的錯誤,如果我們添加一些設定,修改方法如下:
--允許将顯式值插入表的辨別列中 ON-允許 OFF-不允許
set identity_insert OrderList ON--打開
insert into OrderList(id,ordername,createdate)
values(4520,'set',getdate())
set identity_insert OrderList OFF--關閉
在執行這個插入語句時多了一個設定,該設定的文法是
--設定文法:
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }
允許将顯式值插入表的辨別列中
參數說明:
database:針對資料庫
table:針對某張表
ON:允許插入顯式值插入 辨別列
OFF:不允許
注意:
--問題注意
(1)任何時候,會話中隻有一個表的 IDENTITY_INSERT 屬性可以設定為 ON。如果某個表已将此屬性設定為 ON,并且為另一個表發出了 SET IDENTITY_INSERT ON 語句,則 Microsoft® SQL Server™ 傳回一個錯誤資訊,指出 SET IDENTITY_INSERT 已設定為 ON 并報告此屬性已設定為 ON 的表
(2)如果插入值大于表的目前辨別值,則 SQL Server 自動将新插入值作為目前辨別值使用
(3)SET IDENTITY_INSERT 的設定是在執行或運作時設定,而不是在分析時設定
上面執行語句中:把要執行的語句前後加上該設定,當然上面針對事一條記錄插入操作,在這條記錄插入操作後,如果再次插入資料時,沒有啟用該設定,Orderid主鍵列會根據上面自定義表示4520,自動增長到4521.這個操作很靈活關鍵看個人怎麼利用.
B:修改配置檔案
我們通過直接修改配置檔案來處理這個問題,
出錯時檔案配置:
--hibernate持久化類配置 注意id中Generator子節點設定Class屬性為:assigned自動增長
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="TestHibernateExpre.Entities.OrderListModel,TestHibernateExpre" table="OrderList">
<id name="Orderid" column="id" type="int">
<!--id中參數的設定問:native/assigned/foreign/increment-->
<generator class="assigned"></generator>
</id>
</class>
修改後檔案配置:
--Hibernate中關于持久化類的配置 注意id下Generator子節點 class屬性配置為native
<generator class="native"></generator>
</class>
本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/765448