Предотвращение конфликтов при нескольких вызовах базы данных в веб-API - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть таблица случайных уникальных номеров, которые они использовали в качестве идентификатора учетной записи для пользователя.

Этот сценарий будет использоваться в методе Register веб-API для получения первого уникального номера и присоединения его к пользователю, а после успешного создания извлеченный уникальный номер будет удален из базы данных:

        public async Task<ActionResult> Register([FromBody] RegisterDto model)
    {

        //get the first unique number from the database
        var UniqueNumber = _context.UniqueNumbers.First();


        var user = new User
        {
            UserName = model.Email,
            Email = model.Email,
            PhoneNumber = model.PhoneNumber,
            FirstName = model.FirstName,
            LastName = model.LastName,
            UserProfile = new UserProfile()
            {
                AccountNumber = UniqueNumber.Number,
            },
        };

        //creating user
        var createResult = await _userManager.CreateAsync(user, model.Password);
        if (!createResult.Succeeded) return BadRequest(new { isSucceeded = createResult.Succeeded, errors = createResult.Errors });

        //Delete the fetched UniqueId from the database
        _context.UniqueNumbers.Remove(UniqueNumber);
        _context.SaveChanges();

        return Ok(new
        {
            isSucceeded = true
        });
    }

У меня вопрос: как предотвратить коллизию при нескольких вызовах API, поскольку он может возвращать один и тот же уникальный номер для нескольких вызовов?

1 Ответ

0 голосов
/ 13 ноября 2018

В EF Core и Microsoft SQL Server вы должны просто использовать объект SEQUENCE для генерации ваших ключей. См. Последовательности - EF Core

Если вы действительно хотите продолжить работу с вашим оригинальным дизайном, вы можете использовать FromSql для запуска УДАЛИТЬ… ВЫХОД , что-то вроде:

var UniqueNumber = _context.UniqueNumbers.FromSql("delete top (1) from UniqueNumbers output deleted.*").Single();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...