Entity Framework выполняет что-то похожее на ответ gbn:
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');
SELECT t.[CustomerID]
FROM @generated_keys AS g
JOIN dbo.Customers AS t
ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0
Результаты вывода сохраняются во временной табличной переменной, а затем отбираются обратно клиенту. Должен быть в курсе о гоче:
вставки могут генерировать более одной строки, поэтому переменная может содержать более одной строки, поэтому вам может быть возвращено более одной ID
Я понятия не имею, почему EF внутренне присоединяет эфемерную таблицу обратно к реальной таблице (при каких обстоятельствах эти две пары не совпадают).
Но это то, что делает EF.
SQL Server 2008 или новее только. Если это 2005, значит, вам не повезло.