Uso de una base de datos de versiones de noviembre de SQL 2008 R2 y una aplicación de rol de trabajo .net 4.0 Beta 2 Azure. El rol de trabajador recopila datos y los inserta en una sola tabla SQL con una columna de identidad. Como es probable que haya varias instancias de este rol de trabajador ejecutándose, creé un desencadenador Insertar en lugar de en la tabla SQL. El desencadenador realiza la funcionalidad Upsert utilizando la función SQL Merge. Utilizando T-SQL, pude verificar la inserción en lugar de las funciones de desencadenar correctamente, se insertaron nuevas filas mientras se actualizaban las filas existentes. Este es el código para mi gatillo:OptimisticConcurrencyException - SQL 2008 R2 en lugar del desencadenador de inserción con Entity Framework
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
Dentro del rol de trabajo que estoy utilizando Entity Framework para un modelo de objetos. Cuando llamo el método SaveChanges I receieve la siguiente excepción:
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.
Entiendo que esto es debido a likly SQL no informar de un IdentityScope para cada nueva fila insertada/actualizada. Entonces EF cree que las filas no se insertaron y la transacción no se compromete en última instancia.
¿Cuál es la mejor forma de manejar esta excepción? ¿Tal vez usando OUTPUT de la función de combinación de SQL?
Gracias! -Paul
Y si lo estás haciendo EN LUGAR DE ACTUALIZAR, simplemente asegúrate de "ESTABLECER NOCOUNT OFF" justo antes de tu instrucción INSERT, y no realices ningún tipo de selección después de ella. –
Debería marcarse como respuesta –