为什么Entity Framework 6在插入后只选择scope_identity()?

时间:2014-12-28 21:26:12

标签: .net sql-server entity-framework

当您使用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()

而不是那些需要物理读取的东西?

干杯, 曼努埃尔

1 个答案:

答案 0 :(得分:1)

正确。 scope_identity()用于获取生成的CustomerId值,因此EF可以将其用作实体密钥。我想,但我必须猜测,因为它没有记录,SELECTCustomer表上完成,以确保检索到的scope_identity()确实与CustomerId相关。可能会出现INSERT触发更多插入的情况,因此将scope_identity()分配给另一条记录。

查询Customer表的第二个原因是此查询是在一个方法中生成的,该方法也可能将计算列添加到SELECT子句中。无论如何,查询实体表可能更方便。

添加WHERE @@ROWCOUNT > 0子句以确保预期的行数受INSERT语句的影响。在EF的源代码中有一个评论:

  

请注意,我们会对rowcount进行过滤,以确保在没有修改行的情况下不会返回任何行。