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