Проблема, с которой вы столкнулись, заключается в том, что вы попытались вставить один объект с повторяющимся идентификатором, и это не удалось. При повторной попытке вы создаете 2-ю сущность и пытаетесь вставить ее. Первая сущность все еще связана с контекстом и все еще будет пытаться сохранить. Вам необходимо отсоединить его от контекста перед сохранением новой замены или обновить существующую сущность. (Ниже)
hawb = "0402135505536";
var entity = new HawbAsset { HAWB = hawb, HawbStatus = "Allocated", AllocatedDateTime = DateTime.Now, AllocationReference = reference };
while (!uniqueHawb) //insert new hawb
{
//hawb = $"{DateTime.Now:MMddHHmmss}{RandomHelper.GetRandomNumber(0, 999):000}";
try
{
_repository.Insert(entity);
uniqueHawb = true;
}
catch (Exception e)
{
;
}
entity.HAWB = $"{DateTime.Now:MMddHHmmss}{RandomHelper.GetRandomNumber(0, 999):000}";
}
Чтобы отделить сущность, вам нужно использовать context.Entity(entity).State = EntityState.Detached;
, который должен был бы работать через границу вашего хранилища.
В идеале было бы лучше проверить уникальность HAWB перед попыткой вставки, но все же обрабатывать исключение для тех очень, очень редких случаев, когда запись сохраняется между проверкой и сохранением:
int retryCount = 0
while (retryCount < 5)
{
try
{
bool isUnique = false;
string hawb = null;
while(!isUnique)
{
hawb = generateHawb();
isUnique = context.HawbAssets.Any(x => x.HAWB == hawb);
}
entity.HAWB = hawb; // this hawb should be unique, so set and insert.
_repository.Insert(entity);
}
catch(UpdateException)
{
// log that this has happened, check inner exception for duplicate key and retry, though limit retry attempts if there are deeper issues that might lock up the system in a retry loop.
retryCount++;
}
}