Использование базы данных выпуска SQL 2008 R2 и приложения-ролика .net 4.0 Beta 2 Azure. Рабочая роль собирает данные и вставляет их в одну таблицу SQL с одним столбцом идентификатора. Поскольку, вероятно, будет задействовано несколько экземпляров этой рабочей роли, я создал вместо SQL-запроса «Вставить вместо триггера» в таблицу SQL. Триггер выполняет функцию Upsert с помощью функции SQL Merge. Используя T-SQL я смог проверить правильность вставки вместо функций триггера, новые строки были вставлены при обновлении существующих строк. Это код для моего триггера:OptimisticConcurrencyException - SQL 2008 R2 вместо вставки триггера с платформой Entity
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 я 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 считает, что строки не были вставлены, и транзакция в конечном счете не была выполнена.
Каков наилучший способ справиться с этим исключением? Может быть, используя OUTPUT из функции слияния SQL?
Спасибо! -Paul
И если вы делаете INSTEAD OF UPDATE, просто убедитесь, что вы «УСТАНАВЛИВАЙТЕ NOCOUNT OFF» прямо перед оператором INSERT и после этого не выполняете никаких действий. –
Должен быть помечен как ответ –