【问题标题】:Inserting an item returns - Store update, insert, or delete statement affected an unexpected number of rows (0)插入项目返回 - 存储更新、插入或删除语句影响了意外的行数 (0)
【发布时间】:2015-10-29 20:32:11
【问题描述】:

我有一个简单的方法,它使用实体框架将一行插入到我们的一个表中。但是,该表有一个触发器,可以在插入该行后立即对其进行操作。这似乎通过产生错误“存储更新、插入或删除语句影响了意外的行数 (0)”来制作实体框架。我该如何纠正这个问题?

using (var supportContext = new SupportContext(CustomerId))
{
    var mobileUser = new AcctMobileUser
    {
        amu_user_id = userId
    };
    supportContext.AcctMobileUsers.Add(mobileUser);
    await supportContext.SaveChangesAsync();
}

【问题讨论】:

  • here
  • 当它在任何情况下都不是竞争条件时,它很可能与更改跟踪器有关。我希望表中有一个自动增量,但不是你的模型。在这种情况下,EF 尝试使用您提供的 Id 保存您的条目,DBMS 将 Id 设置为自己的值,EF 会检查它是否正确保存并且找不到具有您提供的 Id 值的条目。
  • 这取决于您的触发器实际在做什么。禁用 changetracker 非常容易,但我认为这对您的情况没有帮助。在您的情况下,关闭乐观并发可能会有所帮助,但我真的不建议这样做。
  • 当您打开身份插入并基本上将插入调用包装在事务中时会发生什么?当仍然出现同样的错误时,您的触发器正在做一些可疑的事情,您很可能必须自己计算插入 sql 语句。

标签: c# entity-framework entity-framework-6


【解决方案1】:

您没有显示足够的代码来确定“标题”中的错误是如何发生的。一切都取决于触发器的编码方式及其作用。我建议您获取该代码,它可能会提供有关“标题”更改原因的线索。

【讨论】:

  • 为什么这是一个答案?
  • 我确切地知道该列的更改地点、时间和原因。问题是我无法触摸触发器,因为它存在于 1,000 多个客户数据库中,并且可能会有点混乱。我需要做的就是告诉实体框架插入记录。也许禁用乐观并发会有所帮助。
【解决方案2】:

这是由于 EF 的乐观并发模型而发生的。接收插入的表上的触发器具有“INSTEAD OF INSERT”条件。这导致没有插入行,而是插入了行本身。

通过告诉 EF 简单地执行任意 SQL 插入语句,一切都得到了应有的处理。该方法唯一需要注意的是,该对象不会被返回,因此必须手动获取插入的记录。

【讨论】:

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