我正在使用实体框架并且有一个正在存储的应用程序编号。每次更新时我都有并发令牌,因为存在并发问题,因此没有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);
}
}
答案 0 :(得分:0)
我找到了一个解决方案,并认为我会在这里发布,因为它很难找到,没有人能够提供帮助。我最终将捕获更改为以下
}
catch (DbUpdateException ex)
{
ex.Entries.Single().Reload();
this._context.SaveChanges();
return applicationNumber;
}