使用 SQL 2008 R2 November 发布版数据库和 .net 4.0 Beta 2 Azure 工作角色应用程序。工作角色收集数据并将其插入一个具有一个标识列的单个 SQL 表中。由于可能会运行多个此工作角色实例,因此我在 SQL 表上创建了一个 Insert Instead Of 触发器。触发器使用 SQL Merge 函数执行 Upsert 功能。使用 T-SQL,我能够验证插入而不是触发器的功能正常,新行被插入而现有行被更新。
这是我的触发器代码:
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
在工作角色中,我正在使用Entity Framework进行对象模型。当我调用SaveChanges方法时,我收到以下异常:
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.
我理解这可能是由于SQL没有为每个新插入/更新的行报告IdentityScope所致。然后EF认为这些行没有被插入,事务最终未被提交。
如何处理这个异常?也许使用SQL合并功能的OUTPUT选项是最好的方法?
谢谢! -Paul