如果EF仅设置变量,为什么EF执行此UPDATE语句?

时间:2013-12-16 16:36:54

标签: entity-framework tsql

我正在使用EF 6.0.1。在对某些数据进行SaveChanges()时,我发现这个SQL出现了:

-- this is generated by EF, according to IntelliTrace:
DECLARE @p int
UPDATE [dbo].[GlobalIds]
SET @p = 0
WHERE ([Id] = @0)
SELECT [UniqueId]
FROM [dbo].[GlobalIds]
WHERE @@ROWCOUNT > 0 AND [Id] = @0

MyTable是一个表(duh),它有一个名为Id的int PK,而UniqueId只是一个列(UNIQUEIDENTIFIER,如果它有任何区别的话)。

  1. 这个查询有什么意义? @p是查询上下文中的局部变量 - 为什么需要将其更新为与@ 0参数具有相同的值?
  2. 为什么我们在where子句中需要@@ROWCOUNT > 0
  3. 此查询看起来只相当于选择UniqueId

    SELECT [UniqueId]
    FROM [dbo].[GlobalIds]
    WHERE [Id] = @0
    

    编辑:我知道EF不会输出最佳查询。我试图获得一些关于为什么EF专门做这件事的见解。

1 个答案:

答案 0 :(得分:0)

declare @p int
set @p = 0
select @@rowcount

那回到第一行!

唯一的见解可能是你错过的EF表现(不,这不是一个笑话)。 如果没有匹配

,就会发生这种情况
WHERE ([Id] = @0)

将错误设置@@ rowcount更新为零 和

WHERE @@ROWCOUNT > 0 AND [Id] = @0

生病了,因为@@ ROWCOUNT> 0 == false