我遇到一个问题,两个具有相同PK的记录可以在几毫秒之内通过我的程序运行,导致PK违规,因为实体框架在第一个记录发送之前检查第二条记录是否存在该行。我有一个类来处理此处显示的AddOrUpdate
和SaveChanges
:
public async Task Process(NewEvent newEvent)
{
try
{
_unitOfWork.UnitRepository.AddOrUpdate(newEvent);
await _unitOfWork.SaveAsync();
}
catch (Exception ex)
{
var innerException = ex.InnerException.InnerException as SqlException;
if (ShouldRetry(innerException))
{
numRetries++;
Logger.Warning(innerException.Message);
Logger.Warning($"Now attempting retry #{numRetries}");
await Process(newEvent);
}
else
{
Logger.Error($"An error occured attempting to process {newEvent.eventType}");
throw;
}
}
}
如果发生PK违规,它应该捕获异常并重试该方法,以便再次运行检查,然后第一条记录应该已经通过。但是,无论我做了多少次重试(尝试过20次),它总是无法通过检查。我等不及多久了?
Sidenote,我的界面被注册为Scoped,每次都应该处理UnitOfWork。