使用 SQL 2008 R2 11 月版本数据库和 .net 4.0 Beta 2 Azure 辅助角色应用程序。辅助角色收集数据并将其插入到具有一个标识列的单个 SQL 表中。因为可能会运行此辅助角色的多个实例,所以我在 SQL 表上创建了一个 Insert 而不是触发器。触发器使用 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
在工作人员角色中,我将实体框架用于对象模型。当我调用 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?
谢谢!-保罗