Если ты работаешь через Entity Framework, то вначале добавляешь первую сущность в базу, жмешь сохранить изменения и у тебя в этой сущности изменяется айдишник на созданный в базе, который далее используешь. Это самый топорный вариант. Так же работает, если ты добавляешь вторую сущность в связь с первой, должно корректно создаться.
Если тебя интересует именно sql код, который ты вызываешь из ADO (когда отправляешь команду типа string из кода c#), либо пишешь хранимую процедуру в sql с кодом и вызываешь хранимку так же через ADO.net, то тебе нужно что-то типа такого:
string queryString =
String.Format(@"
insert into UserProfile (vk_id, DialogQuestId, UserName,Race, access_token) values ({0}, 1 ,N'{1}',{2}, '{3}')
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]"
, vk_id, name, race, access_token);
var dt = await GetDataAsync(queryString);
if (dt == null || dt.Rows.Count == 0) return 0;
int id = int.Parse(dt.Rows[0]["SCOPE_IDENTITY"].ToString());
await SetDataAsync($"insert into UserMoney (UserId, Cr) values ({id},50)");
GetDataAsync и SetDataAsync - работа через ADO.net, вынесенная в отдельные функции
var result = new DataTable();
using (var connection = new SqlConnection(myConnString))
using (var command = new SqlCommand(query, connection))
{
await command.Connection.OpenAsync().ConfigureAwait(false);
var da = new SqlDataAdapter(command);
da.Fill(result);
}
return result;
Код немного корявый, но, думаю, выдернешь что тебе нужно