C# 防止Web API中的多个数据库调用发生冲突
我有一个随机唯一编号的表格,它们作为用户的帐户Id 此场景将使用Web API的in Register方法获取第一个唯一编号并将其附加到用户中,成功创建后,将从数据库中删除获取的唯一编号: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
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。正如我所说,序列不符合我的要求(不是随机生成的),所以我认为我应该坚持我的设计。不过,我想这个命令会完美地完成我的工作,非常感谢!