Sql server 为什么EF生成insert SQL时需要@ROWCOUNT
我发现在插入之后,Entity Framework Core立即向数据库服务器发送另一个命令:Sql server 为什么EF生成insert SQL时需要@ROWCOUNT,sql-server,entity-framework-6,entity-framework-core,Sql Server,Entity Framework 6,Entity Framework Core,我发现在插入之后,Entity Framework Core立即向数据库服务器发送另一个命令: SELECT [Id] FROM [Responses] WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity(); 但是为什么需要检查@ROWCOUNT?这不是scope\u identity()返回了我们需要知道的关于新插入记录的唯一密钥吗?检查@@ROWCOUNT是非常多余的,不是吗 其他信息: 如果我分别插入两行,则只有两个“受影响的1行”文本,而不是
SELECT [Id]
FROM [Responses]
WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
但是为什么需要检查@ROWCOUNT?这不是scope\u identity()
返回了我们需要知道的关于新插入记录的唯一密钥吗?检查@@ROWCOUNT是非常多余的,不是吗
其他信息:
如果我分别插入两行,则只有两个“受影响的1行”文本,而不是“受影响的2行”
@@ROWCOUNT
SCOPE\u IDENTITY()
@@ROWCOUNT
将返回最后一条语句影响的行数,其中asSCOPE\u IDENTITY()
返回插入同一范围内标识列的最后一个标识值。它们是完全不同的。它似乎有意放在那里,以确保如果先前插入了多行,select将不返回任何内容。这是有意义的,因为如果您确定新的Id
是正确的,您只想返回它。我们基本上是在猜测EF的意图。。。而且它看起来像是有意阻止一个边缘案例,其中可能插入了两条记录。这是“防御性编码”——如果没有防御性编码,则极有可能返回错误的Id
,这可能是灾难性的。最好在代码中抛出一个异常(我猜如果Id
为NULL或未返回,它会做什么)我投票以主题外的方式结束这个问题,因为这是问为什么某个特性以某种方式在EF中编写。OP需要询问该工具的开发人员,而不是其他人。插入INSERT
可能会失败SCOPE_IDENTITY()
在本例中仍将返回上次生成的标识的值,当然,kicker是,该值可能与我们未插入的已存在的行匹配。(事实上,这可能是INSERT
首先失败的原因——因为有人明确使用了identity\u INSERT
或dbcc checkident
);声明@t表(ID INT-IDENTITY(1000,1)检查(ID 1000));插入@t默认值;选择@@ROWCOUNT,作用域\标识()@@ROWCOUNT
SCOPE\u IDENTITY()
@@ROWCOUNT
将返回最后一条语句影响的行数,其中asSCOPE\u IDENTITY()
返回插入同一范围内标识列的最后一个标识值。它们是完全不同的。它似乎有意放在那里,以确保如果先前插入了多行,select将不返回任何内容。这是有意义的,因为如果您确定新的Id
是正确的,您只想返回它。我们基本上是在猜测EF的意图。。。而且它看起来像是有意阻止一个边缘案例,其中可能插入了两条记录。这是“防御性编码”——如果没有防御性编码,则极有可能返回错误的Id
,这可能是灾难性的。最好在代码中抛出一个异常(我猜如果Id
为NULL或未返回,它会做什么)我投票以主题外的方式结束这个问题,因为这是问为什么某个特性以某种方式在EF中编写。OP需要询问该工具的开发人员,而不是其他人。插入INSERT
可能会失败SCOPE_IDENTITY()
在本例中仍将返回上次生成的标识的值,当然,kicker是,该值可能与我们未插入的已存在的行匹配。(事实上,这可能是INSERT
首先失败的原因——因为有人明确使用了identity\u INSERT
或dbcc checkident
);声明@t表(ID INT-IDENTITY(1000,1)检查(ID 1000));插入@t默认值;选择@@ROWCOUNT,作用域\标识()代码>。