Использование базы данных выпуска SQL 2008 R2 за ноябрь и приложения .net 4.0 Beta 2 Azure для рабочих ролей. Рабочая роль собирает данные и вставляет их в одну таблицу SQL с одним столбцом идентификаторов. Поскольку, вероятно, будет запущено несколько экземпляров этой рабочей роли, я создал триггер вставки вместо таблицы SQL. Триггер выполняет функцию Upsert с помощью функции SQL Merge. Используя 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 считает, что строки не были вставлены, и транзакция в конечном итоге не зафиксирована.
Как лучше всего справиться с этим исключением? Может быть, с использованием OUTPUT из функции слияния SQL?
Спасибо!
-Поль