使用 Entity Framework 4.1,Ladislav 发布的将 Scope_Identity() 的 Select 添加到触发器主体末尾的解决方案为我解决了这个问题。为了完整起见,我在这里复制了整个触发器的创建。通过这个触发器定义,我可以使用 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
编辑处理计算值(感谢 cmets 中的 Chris Morgan):
如果您在表中有任何其他计算值,您也必须将它们包括在 SELECT 中。例如,如果您有一个使用 GETDATE() 的 CreatedDate 列,您可以像这样进行选择:
SELECT [AddressId], [CreatedDate] from [dbo].Addresses where @@ROWCOUNT > 0 and AddressId = scope_identity();