【发布时间】:2019-10-21 14:54:21
【问题描述】:
我在控制器中有以下代码
public async Task<IActionResult> Post(string imei)
{
var device = await _dbContext.Devices.FirstOrDefaultAsync(x => x.Imei == imei);
if (device == null)
{
await _dbContext.Devices.AddAsync(new Device(imei));
await _dbContext.SaveChangesAsync();
}
else
{
throw new ConflictException($"Device with IMEI '{imei}' already exists");
}
return Ok();
}
很难重现,但有时我得到了
23505:重复键值违反唯一约束 \"devices_imei_key\"
似乎device 为空,但当SaveChanges 时它已经不为空。我怎样才能避免使用try...catch?我可以使用AsNoTacking() 来提高数据库的读取效率吗?
【问题讨论】:
-
这可能是time-of-check to time-of-use 问题 - 当您检查它不存在时,但当您保存它时,它已经创建了。您的应用添加了多少台设备?
-
是的,似乎是。大约每分钟 10 个,但有时每秒 10 个
-
如果这是您的应用程序设置的行为方式,即您可以在检查它和保存它之间设置一个设备 - 我想不出更简单的方法来处理它不是
try catch,重复键的特定例外。另一种选择 - 创建一个用于插入新设备的存储过程并在其中处理这种情况 - 但在某种程度上你将不得不处理异常。 -
您能否详细解释一下“在您检查它和保存它之间设置一个设备”。谢谢
-
@Chebur - 我的意思是在您检查它和尝试保存它之间正在设置一个新设备 - 这就是您在上面描述的场景。
标签: c# entity-framework-core asp.net-core-webapi