文章來自:博客園-xgcdd
{"當 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 <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="native"></generator> </id> </class>