3 回答
TA贡献1864条经验 获得超2个赞
您看到的问题是因为您尝试插入一个具有重复 ID 的实体但失败了。重试时,您正在创建第二个实体并尝试插入它。第一个实体仍与上下文相关联,并且仍将尝试保存。在保存新替换或更新现有实体之前,您需要将其与上下文分离。(以下)
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++;
}
}
TA贡献1829条经验 获得超9个赞
它的 1 行额外代码用于检查实体是否存在。先做这件事,不要依赖错误处理来完成工作:
if ( _repository.HAWBAssets.FirstOrDefault(i => i.HAWB == hawb)== null)
{
_repository.Insert(entity);
uniqueHawb = true;
}
TA贡献1796条经验 获得超10个赞
也许您可以使用纳秒来使记录之间的距离变大,以减少重复的可能性
entity.HAWB = $"{DateTime.Now.Ticks}";
// 636898603227146583
DateTime.Ticks分辨率为 100 纳秒
- 3 回答
- 0 关注
- 121 浏览
添加回答
举报