【问题标题】:Why is DbContext.SaveChangesAsync throwing a "Subquery returned more than 1 value" error?为什么 DbContext.SaveChangesAsync 会引发“子查询返回超过 1 个值”错误?
【发布时间】:2018-11-10 23:27:33
【问题描述】:

标题中的错误目前仅在我的 QA 环境中发生,而不是在我的 DEV 环境中。我已将本地计算机指向 QA 环境,运行 SQL 跟踪,并且可以 1) 重现错误并 2) 查看正在生成的实际 SQL 代码。

我不明白的是,这样的错误怎么可能在更新时发生?这是我的代码:

            var investigation = await (
                        from  ti in DbContext.Investigation
                        where ti.Id == model.InvestigationId
                        select ti
                    ).SingleAsync();

            investigation.QueueId = model.QueueId;

            var result = await DbContext.SaveChangesAsync();

            return result;

我最初认为第一行(查询)返回了多个结果,这是有道理的。但是,错误发生在var result = await DbContext.SaveChangesAsync(); 行上。有人可以指出我正确的方向来解决这个问题吗? SQL Server Profiler 提取的我的 SQL 查询:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Investigation] SET [QueueId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

',N'@p1 bigint,@p0 smallint',@p1=7863,@p0=4

【问题讨论】:

  • 我怀疑一个更新触发器有一个导致错误的错误。
  • @Dan Guzman -- 废话谢谢。请留下您的评论作为答案,我很乐意接受!所以我不知道这是怎么发生的,但是一堆插入语句以某种方式放置在我的触发器中,但是在 END 关键字之后。不知何故,这只发生在质量检查中;在 PROD 或 DEV 中不存在。但是从那里删除那些垃圾解决了这个问题!
  • @Dan Guzman -- 您能否在回答中详细说明您是如何认为这是问题的原因?
  • 无关的触发器代码可能是因为有人在更改触发器时错过了一个 GO 批处理终止符,因此批处理的其余部分包含在触发器中而不是单独执行。

标签: c# sql-server entity-framework-core asp.net-core-webapi sqlexception


【解决方案1】:

此问题代码中没有子查询,如错误消息所示:

exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Investigation] SET [QueueId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;
',N'@p1 bigint,@p0 smallint',@p1=7863,@p0=4

因此,错误必须在UPDATE 语句触发的触发器代码中。

我从您的评论中看到,无关的 INSERT 语句无意中包含在触发代码中。这些症状的一个更常见的原因是触发器的编码不正确,预计会有单行受到影响。触发器每条语句触发一次,而不是每行,因此触发器代码处理多行的可能性很重要。

【讨论】:

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