Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么EF生成insert SQL时需要@ROWCOUNT_Sql Server_Entity Framework 6_Entity Framework Core - Fatal编程技术网

Sql server 为什么EF生成insert SQL时需要@ROWCOUNT

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行”文本,而不是

我发现在插入之后,Entity Framework Core立即向数据库服务器发送另一个命令:

SELECT [Id]
FROM [Responses]
WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
但是为什么需要检查@ROWCOUNT?这不是
scope\u identity()
返回了我们需要知道的关于新插入记录的唯一密钥吗?检查@@ROWCOUNT是非常多余的,不是吗

其他信息:

如果我分别插入两行,则只有两个“受影响的1行”文本,而不是“受影响的2行”


@@ROWCOUNT
SCOPE\u IDENTITY()
@@ROWCOUNT
将返回最后一条语句影响的行数,其中as
SCOPE\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
将返回最后一条语句影响的行数,其中as
SCOPE\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,作用域\标识()