为什么DbContext.SaveChangesAsync抛出“子查询返回的值超过1”错误?

时间:2018-05-31 21:20:20

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

标题中的错误仅在我的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查询由SQL Server Profiler提取:

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

1 个答案:

答案 0 :(得分:0)

此问题代码中没有子查询,因为错误消息表明:

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语句无意中包含在触发器代码中。这些症状的一个更常见的原因是触发器编码不正确,预计单行会受到影响。每个语句触发一次触发器,而不是每行触发一次,因此触发器代码处理多行的可能性非常重要。