sql-server - 插入到具有而不是来自实体数据框架的触发器的表中时出错

标签 sql-server sql-server-2008 entity-framework-4 triggers

我正在使用 Entity Framework 4,在使用 Entity Framework 在具有替代插入触发器的表中插入新记录时,当表具有标识列时,替代触发器用于根据插入的值之一修改对于某些逻辑, Entity Framework 引发异常“存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体以来,实体可能已被修改或删除。刷新 ObjectStateManager 条目”。

任何人都可以帮助如何解决此异常吗?

最佳答案

使用 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

编辑处理计算值(感谢评论中的 Chris Morgan):

如果表中有任何其他计算值,您也必须将它们包含在 SELECT 中。例如,如果您有一个使用 GETDATE()CreatedDate 列,您将进行如下选择:

SELECT [AddressId], [CreatedDate] from [dbo].Addresses where @@ROWCOUNT > 0 and AddressId = scope_identity();

关于sql-server - 插入到具有而不是来自实体数据框架的触发器的表中时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5820992/

相关文章:

C# - 如果未提供字节数组,如何传递空值?

sql-server - 帮助理解 SQL 存储过程参数

c# - 使用 Code First 方法中的 Id 从数据库上传、保存和检索图像

entity-framework-4 - EF 代码优先 : How do I make a virtual collection private while still having it correctly create my database model?

sql - 数据更新审批的DB设计

sql-server - SQL 2008 R2 标准 - 索引 View 支持

sql-server-2008 - 加快 SQL Server 2008 插入查询

sql-server - T-SQL 通过列查询获取最大记录

sql - 查找 "{"和 "}"中包含的文本并将其插入表中

entity-framework - 我可以强制使用 Entity Framework 的多重性/关联吗?