sql-server - sql server select xml node
error al insertar en la tabla que tiene en lugar de desencadenar desde el marco de datos de la entidad (4)
En lugar de desencadenar, se ejecuta en lugar de la operación de inserción creada por Entity framework. Esto puede ser un problema potencial porque una vez que está usando la columna de identidad, cada inserción es seguida por:
select [Id]
from [dbo].[TableXXX]
where @@ROWCOUNT > 0 and [Id] = scope_identity()
Entonces, la pregunta es qué sucede con esta consulta una vez que se reemplaza el inserto. Si se ejecuta y devuelve nulo, se obtiene una excepción. Puede agregarlo después de insertar el registro en su desencadenador, pero no será de ayuda si también se ejecuta la consulta original.
Puede cambiar su activador antes o después de insertar y modificar datos.
Estoy utilizando entity framework 4, al insertar un nuevo registro utilizando entity framework en una tabla que tiene en lugar de insert trigger mientras que la tabla tiene una columna de identidad, en lugar de trigger se usa para modificar uno de los valores insertados según cierta lógica , Entity framework plantea una excepción "La actualización de la tienda, la inserción o la eliminación afectó a un número inesperado de filas (0). Las entidades pueden haberse modificado o eliminado desde la carga de las entidades. Renovar las entradas de ObjectStateManager".
¿Alguien puede ayudar a evitar esta excepción?
También debe devolver las propiedades marcadas como Computadas
select [Id], [YourComputedColumn]
from [dbo].[TableXXX]
where @@ROWCOUNT > 0 and [Id] = scope_identity()
También encontré que necesita tener el StoreGeneratedPattern configurado en Identity para que funcione en una columna nvarchar que estaba usando como clave principal pero que no generaba un valor de identidad. Esto fue para situaciones de un desencadenante de inserción posterior que calculó un valor único para almacenar en la columna de clave. En otras situaciones (agregar y actualizar), puede requerir establecerse en Computado.
Usando Entity Framework 4.1, la solución publicada por Ladislav para agregar una Select of Scope_Identity () al final del cuerpo del disparador resolvió el problema para mí. He copiado toda la creación de disparadores aquí para completar. Con este argumento defensivo, pude agregar filas a la tabla usando context.SaveChanges ().
ALTER TRIGGER [dbo].[CalcGeoLoc]
ON [dbo].[Address]
INSTEAD OF INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT OFF;
-- Insert statements for trigger here
INSERT INTO Address (Street, Street2, City, StateProvince, PostalCode, Latitude, Longitude, GeoLoc, Name)
SELECT Street, Street2, City, StateProvince, PostalCode, Latitude, Longitude, geography::Point(Latitude, Longitude, 4326), Name
FROM Inserted;
select AddressId from [dbo].Address where @@ROWCOUNT > 0 and AddressId = scope_identity();
END
Editar para manejar valores calculados (Gracias a Chris Morgan en los comentarios):
Si tiene otros valores calculados en la tabla, deberá incluirlos en SELECT también. Por ejemplo, si tiene una columna CreatedDate
que usa GETDATE()
, debe hacer la selección de esta manera:
SELECT [AddressId], [CreatedDate] from [dbo].Addresses where @@ROWCOUNT > 0 and AddressId = scope_identity();