亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免重復插入數據庫

避免重復插入數據庫

C#
叮當貓咪 2022-11-22 15:36:15
我有以下代碼插入一個具有隨機生成值“hawb”的實體作為列之一。我的想法是,因為hawb是表中的唯一列,所以 try-catch 塊將在插入重復值時捕獲異常。工作流程工作正常,直到我開始測試它并出現一些奇怪的錯誤。[Code]hawb = "0402135505536";while (!uniqueHawb)  //insert new hawb{    //hawb = $"{DateTime.Now:MMddHHmmss}{RandomHelper.GetRandomNumber(0, 999):000}";    var entity = new HawbAsset { HAWB = hawb, HawbStatus = "Allocated", AllocatedDateTime = DateTime.Now, AllocationReference = reference };    try    {        _repository.Insert(entity);        uniqueHawb = true;    }    catch (Exception e)    {        ;    }    hawb = $"{DateTime.Now:MMddHHmmss}{RandomHelper.GetRandomNumber(0, 999):000}";}[Model]    public class HawbAsset : BaseEntity    {        [Required(AllowEmptyStrings = false)]        [Index(IsUnique = true)]        [StringLength(15)]        public string HAWB { get; set; }        [Required(AllowEmptyStrings = false)]        public string HawbStatus { get; set; }        public DateTime? AllocatedDateTime { get; set; }        [Required(AllowEmptyStrings = false)]        public string AllocationReference { get; set; }        public DateTime? ConfirmedUsageDateTime { get; set; }        public DateTime? RecycledDateTime { get; set; }        public string Owner { get; set; }    }我硬編碼了一個重復值 0402135505536,因此它會在第一時間捕獲“重復鍵異?!?,這是預期的。然而,當 hawb 是隨機生成的,并且我已經確定值不同時,它仍然會捕獲相同的“Duplicate Key Exception”。誰能告訴我發生了什么以及如何實現我的目標?謝謝!
查看完整描述

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++;

  }

}


查看完整回答
反對 回復 2022-11-22
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

它的 1 行額外代碼用于檢查實體是否存在。先做這件事,不要依賴錯誤處理來完成工作:


if ( _repository.HAWBAssets.FirstOrDefault(i => i.HAWB == hawb)== null)

    {

     _repository.Insert(entity);

        uniqueHawb = true;

    }


查看完整回答
反對 回復 2022-11-22
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

也許您可以使用納秒來使記錄之間的距離變大,以減少重復的可能性


entity.HAWB = $"{DateTime.Now.Ticks}";

// 636898603227146583

DateTime.Ticks分辨率為 100 納秒


查看完整回答
反對 回復 2022-11-22
  • 3 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號