C# 防止Web API中的多个数据库调用发生冲突

C# 防止Web API中的多个数据库调用发生冲突,c#,.net,entity-framework,rest,asp.net-web-api,C#,.net,Entity Framework,Rest,Asp.net Web Api,我有一个随机唯一编号的表格,它们作为用户的帐户Id 此场景将使用Web API的in Register方法获取第一个唯一编号并将其附加到用户中,成功创建后,将从数据库中删除获取的唯一编号: public async Task<ActionResult> Register([FromBody] RegisterDto model) { //get the first unique number from the database

我有一个随机唯一编号的表格,它们作为用户的帐户Id

此场景将使用Web API的in Register方法获取第一个唯一编号并将其附加到用户中,成功创建后,将从数据库中删除获取的唯一编号:

        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
        });
    }
public异步任务寄存器([FromBody]RegisterDto模型)
{
//从数据库中获取第一个唯一编号
var UniqueNumber=_context.UniqueNumbers.First();
var user=新用户
{
用户名=model.Email,
Email=model.Email,
PhoneNumber=model.PhoneNumber,
FirstName=model.FirstName,
LastName=model.LastName,
UserProfile=新的UserProfile()
{
AccountNumber=UniqueNumber.Number,
},
};
//创建用户
var createResult=await_userManager.CreateAsync(用户、模型、密码);
如果(!createResult.succeed)返回BadRequest(新的{isSucceeded=createResult.succeed,errors=createResult.errors});
//从数据库中删除获取的唯一ID
_context.UniqueNumbers.Remove(UniqueNumber);
_SaveChanges();
返回Ok(新的
{
isSucceeded=真
});
}

我的问题是如何防止API上的多个调用发生冲突,因为它可能会为多个调用返回相同的唯一编号?

在EF Core和Microsoft SQL Server上,您只需使用序列对象生成密钥即可。看

如果您真的想继续您的原始设计,您可以使用FromSql来运行,例如:

var UniqueNumber = _context.UniqueNumbers.FromSql("delete top (1) from UniqueNumbers output deleted.*").Single();

什么数据库?什么版本的EF?没有一种通用的方法可以做到这一点。@DavidBrowne Microsoft我正在使用EF Core 2.1和MSSQL,我在考虑使用事务范围,但我不确定它是如何工作的……为什么还要到一个表中进行此操作?你能不能用一个引导类型,然后用c#code中的combguid生成它。@Fran我真的需要这个Id是一个整数值,只有10个数字。(业务逻辑),所以我不能使用GUID。正如我所说,序列不符合我的要求(不是随机生成的),所以我认为我应该坚持我的设计。不过,我想这个命令会完美地完成我的工作,非常感谢!