【问题标题】:Store update, insert, or delete statement affected an unexpected > number of rows (0)存储更新、插入或删除语句影响了意外的 > 行数 (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 阅读了有关异常的一些详细信息,经过一些研究,我在stackoverflow 上发现了similar 问题。但是在尝试解决方案时,我读到 DbContext 没有 Refresh() 方法,所以我尝试了:

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

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

【问题讨论】:

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

标签: sql asp.net sql-server entity-framework triggers


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多