当您使用EF 6.1保存实体时,会生成并执行以下SQL代码:
exec sp_executesql N'INSERT [dbo].[Customers]([Name], [FirstName])
VALUES (@0, @1)
SELECT [CustomerId]
FROM [dbo].[Customers]
WHERE @@ROWCOUNT > 0 AND [CustomerId] = scope_identity()',N'@0 nvarchar(max) ,@1 nvarchar(max) ',@0=N'Wenk',@1=N'Manuel'
我理解,插入/选择已完成,以便在保存后检索CustomerId列immediatley的值。据我所知,scope_identity()返回值,为什么没有类似
的东西SELECT scope_identity()
而不是那些需要物理读取的东西?
干杯, 曼努埃尔
答案 0 :(得分:1)
正确。 scope_identity()
用于获取生成的CustomerId
值,因此EF可以将其用作实体密钥。我想,但我必须猜测,因为它没有记录,SELECT
在Customer
表上完成,以确保检索到的scope_identity()
确实与CustomerId
相关。可能会出现INSERT
触发更多插入的情况,因此将scope_identity()
分配给另一条记录。
查询Customer
表的第二个原因是此查询是在一个方法中生成的,该方法也可能将计算列添加到SELECT子句中。无论如何,查询实体表可能更方便。
添加WHERE @@ROWCOUNT > 0
子句以确保预期的行数受INSERT
语句的影响。在EF的源代码中有一个评论:
请注意,我们会对rowcount进行过滤,以确保在没有修改行的情况下不会返回任何行。