如何在不抛出异常的情况下处理带有并发错误的DbUpdateException

时间:2017-10-30 20:14:09

标签: entity-framework concurrency

我正在使用实体框架并且有一个正在存储的应用程序编号。每次更新时我都有并发令牌,因为存在并发问题,因此没有2个应用程序编号是相同的。

并发令牌在发生时会抛出错误,但我需要再次运行代码以获取下一个数字而不是抛出错误。我们需要在后端处理它。在我们锁定表之前,我已经看到了一些地方,实体更喜欢并发令牌。

下面是我的代码,问题是当抛出异常时,它再次运行调用,但它总是抛出错误。

的DbContext

protected override void OnModelCreating(ModelBuilder builder)
{
     builder.Entity<ApplicationNumberHelper>()
        .Property(x => x.RowVersion)
        .IsConcurrencyToken()
        .ValueGeneratedOnAddOrUpdate();

      base.OnModelCreating(builder);
}

DTO

public class ApplicationNumberHelper
  {
    public int Id { get; set; }

    public long CurrentApplicationNumber { get; set; }

    public byte[] RowVersion { get; set; }
  }

拨打

public string GetNextApplicationNumber(int branchNumber)
    {
      try
      {
        var applicationNumberHelper = this._context.ApplicationNumberHelper.FirstOrDefault();

        if (applicationNumberHelper != null)
        {
          applicationNumberHelper.CurrentApplicationNumber = applicationNumberHelper.CurrentApplicationNumber + 1;
        }
        else
        {
          applicationNumberHelper = new ApplicationNumberHelper
          {
            CurrentApplicationNumber = 1
          };
        }   

        this._context.ApplicationNumberHelper.Update(applicationNumberHelper);
        this._context.SaveChanges();

        return applicationNumberHelper.CurrentApplicationNumber;
      }
      catch (DbUpdateException ex)
      {
        return this.GetNextApplicationNumber(branchNumber);
      }
    }

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,并认为我会在这里发布,因为它很难找到,没有人能够提供帮助。我最终将捕获更改为以下

}
catch (DbUpdateException ex)
{
    ex.Entries.Single().Reload();
    this._context.SaveChanges();
    return applicationNumber;
}