Za pomocą Entity Framework 4,1 rozwiązanie opublikowane przez Ladislava w celu dodania Select of Scope_Identity() na końcu ciała wyzwalacza rozwiązało problem. Skopiowałem tutaj całą kreację wyzwalacza dla kompletności. Dzięki tej definicji wyzwalacza mogłem dodawać wiersze do tabeli za pomocą 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
Edytuj do obsługi obliczonych wartości (Podziękowania dla Chrisa Morgana w komentarzach):
Jeśli masz w tabeli jakieś inne obliczone wartości, będziesz musiał uwzględnić je również w SELECT. Na przykład, jeśli masz CreatedDate
kolumna, która używa GETDATE()
dokonasz wyboru w ten sposób:
SELECT [AddressId], [CreatedDate] from [dbo].Addresses where @@ROWCOUNT > 0 and AddressId = scope_identity();