Я за второй вариант. Третий в данном случае ему эквивалентный, но более короткий. Первый вообще неправильный, так как считай ты запускаешь сохранение в фоне - потенциально контекст может задиспозиться раньше, чем сохранение закончится, и получишь ошибку - так делать не надо. Первый вариант можно переписать вот так
public Task SaveChangesAsync()
{
return _dbContext.SaveChangesAsync();
}
Так уже лучше, но есть другая проблема - будет потеряна часть stacktrace в случае возникновения ошибки. Так что рекомендую остановиться на варианте 2 или 3.