为什么 DbContext.SaveChangesAsync 会抛出 "Subquery returned more than 1 value" 错误?
Why is DbContext.SaveChangesAsync throwing a "Subquery returned more than 1 value" error?
标题中的错误目前只发生在我的 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 查询为 picked-up:
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
如错误信息所示,此问题代码中没有子查询:
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
语句无意中包含在触发器代码中。这些症状的一个更常见的原因是触发器编码不当,预计单行会受到影响。触发器每条语句触发一次,而不是每行触发一次,因此触发器代码处理多行的可能性很重要。
标题中的错误目前只发生在我的 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 查询为 picked-up:
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
如错误信息所示,此问题代码中没有子查询:
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
语句无意中包含在触发器代码中。这些症状的一个更常见的原因是触发器编码不当,预计单行会受到影响。触发器每条语句触发一次,而不是每行触发一次,因此触发器代码处理多行的可能性很重要。