使用SQL 2008 R2 11月發行版數據庫和.net 4.0 Beta 2 Azure工作程序角色應用程序。 worker角色收集數據並將其插入到具有一個標識列的單個SQL表中。因爲這個worker角色可能會有多個實例在運行,所以我在SQL表上創建了一個Insert Between Of觸發器。觸發器使用SQL合併功能執行Upsert功能。使用T-SQL,我能夠正確驗證插入而不是觸發器函數,在更新現有行時插入新行。 這是我的觸發代碼:我使用實體框架的對象模型OptimisticConcurrencyException - SQL 2008 R2,而不是使用實體框架插入觸發器
Create Trigger [dbo].[trgInsteadOfInsert] on [dbo].[Cars] Instead of Insert
as
begin
set nocount On
merge into Cars as Target
using inserted as Source
on Target.id=Source.id AND target.Manufactureid=source.Manufactureid
when matched then
update set Target.Model=Source.Model,
Target.NumDoors = Source.NumDoors,
Target.Description = Source.Description,
Target.LastUpdateTime = Source.LastUpdateTime,
Target.EngineSize = Source.EngineSize
when not matched then
INSERT ([Manufactureid]
,[Model]
,[NumDoors]
,[Description]
,[ID]
,[LastUpdateTime]
,[EngineSize])
VALUES
(Source.Manufactureid,
Source.Model,
Source.NumDoors,
Source.Description,
Source.ID,
Source.LastUpdateTime,
Source.EngineSize);
End
在輔助角色。當我調用SaveChanges方法我receieve以下異常:
OptimisticConcurrencyException
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
我明白這是likly由於SQL不回報告爲每個新的插入/更新的行的IdentityScope已。然後EF認爲行沒有被插入,並且事務最終沒有被提交。
處理此異常的最佳方法是什麼?也許使用SQL合併函數中的OUTPUT?
謝謝! -Paul
如果您正在進行INSTEAD OF UPDATE,只要確保在INSERT語句之前「SET NOCOUNT OFF」,並且不要在它之後進行任何類型的選擇。 – 2012-04-25 17:57:02
應該標記爲答案 – 2013-03-27 22:53:59