存储更新、插入或删除语句影响了意外的 > 行数 (0)

Posted

技术标签:

【中文标题】存储更新、插入或删除语句影响了意外的 > 行数 (0)【英文标题】:Store update, insert, or delete statement affected an unexpected > number of rows (0) 【发布时间】:2016-06-12 07:28:55 【问题描述】:

我正在创建 WCF restful 服务,当我尝试通过实体框架将记录添加到我的数据库中时,我得到了这个异常:

存储更新、插入或删除语句影响了意外 行数 (0)。实体可能已被修改或删除 实体已加载。

我在我的数据库中创建了一个触发器,它的工作原理是:

GO
CREATE TRIGGER [dbo].[Trigger_groupLocation_date]
    ON [dbo].[groupLocation]
    INSTEAD OF INSERT
    AS
    BEGIN
        SET NoCount ON
        DECLARE @s int
        DECLARE @g_id int
        DECLARE @lat float
        DECLARE @lon float
        SELECT @s = sender FROM inserted
        SELECT @g_id = g_id FROM inserted
        SELECT @lat = latitude FROM inserted
        SELECT @lon = longitude FROM inserted

        insert into [groupLocation] (sender,g_id,latitude,longitude) values(@s,@g_id,@lat,@lon)
    END

需要注意的一点是,我可以将记录直接添加到数据库中。我从here 阅读了有关异常的一些详细信息,经过一些研究,我在*** 上发现了similar 问题。但是在尝试解决方案时,我读到 DbContext 没有 Refresh() 方法,所以我尝试了:

var ctx = ((IObjectContextAdapter)db).ObjectContext;
ctx.Refresh();

但我仍然遇到同样的异常。然后我读到here,只有当您使用代码优先方法时,这种解决方法才能工作,我使用的是“数据库方法中的 EF 设计器”。如何在数据优先方法中访问 Refresh 方法?

【问题讨论】:

一段时间你可以评论一下触发器然后试试,现在抛出什么异常。因为 EF 可能不允许同时进行其他更改 如果我注释掉触发器然后服务运行顺利并且没有抛出异常。 【参考方案1】:

尝试在您的触发器中添加这行 SQL 代码AFTER插入:

select g_id from [groupLocation] where @@ROWCOUNT > 0 and g_id = scope_identity();

我假设g_id 是您的身份列,如果不是,请将上述语句中出现的g_id 都替换为身份列。

另请阅读这个 SO 问题 - Error when inserting into table having instead of trigger from entity data framework

【讨论】:

以上是关于存储更新、插入或删除语句影响了意外的 > 行数 (0)的主要内容,如果未能解决你的问题,请参考以下文章

我收到存储更新、插入或删除语句影响了意外的行数 (0) 错误

[Asp.net mvc]实体更新异常:存储区更新插入或删除语句影响到了意外的行数。实体在加载后可能被修改或删除。

插入、更新或删除的 CASE 语句

使用在多个列上具有主键的实体框架更新数据库

在 SaveChanges 的实体框架中出现错误

知识点4